バグ:大文字・小文字変換区別せずに比較できたと思ったら

Posted: 2013年06月10日

文字列操作(大文字・小文字変換)で書いてしまうバグを紹介します。

プログラムプログラム:

 #include <stdio.h>

 int main(int argc, char *argv[])
 {
    char *pArg = _strupr(argv);

    if (strstr(pArg, "-A") == NULL) {
        printf("%sは指定できません", argv);
        return -1;
    }

    // 処理

    return 0;
 }

このプログラムにどのように文字列操作(大文字・小文字変換)にバグが存在すると思いますか?

  • struprは引数の文字列を変換しそのアドレスを返却します。
      エラーメッセージには、大文字に変換された値が表示されます。

改善版プログラム改善版プログラム:

 #include <stdio.h>

 int main(int argc, char *argv[])
 {
    char *pArg = strdup(argv);
    _strupr(pArgv);

    if (strstr(pArg, "-A") == NULL) {
        printf("%sは指定できません", argv);
        free(pArgv);
        return -1;
    }

    // 処理

    free(pArg);

    return 0;
 }

解説解説:

strdupにてコピーを取ります。
コピー先の値を変換することで
struprで行われる変換は、コピー元には影響しません。

よってエラーメッセージの表示では、入力値通りの値が表示されます。

今回は、例として大文字変換のstruprを用いましたが
小文字変換のstrlwrも同様の問題があります。

カテゴリー: バグ, プログラム | タグ: , , | コメント無し »

コメント