バグ:文字列のコピー

Posted: 2013年05月20日

文字列操作(文字のコピー)で書いてしまうバグを紹介します。

プログラムプログラム:

 #include <stdio.h>

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

    // 処理

    if (pArg != NULL) {
        free(pArg);
    }

    return 0;
 }

このプログラムにどのように文字列操作(書式文字列の取得)にバグが存在すると思いますか?

  • strdupは、NULL文字までのコピーをするため一部しかコピーされない

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

 #include <stdio.h>

 int main(int argc, char *argv[])
 {
     // パラメータの長さ
    int nlength = argv[argc - 1] + strlen(argv[argc - 1]) - argv;
    char *pArg = new char[nlength + 1];
    memcpy(pArg, argv, nlength);

    // 処理

    if (pArg != NULL) {
        delete[] pArg;
    }

    return 0;
 }

解説解説:

パラメータの長さを取得しその文の領域を確保します。
パラメータの長さは以下の式で求めます。

最後の要素の最後の位置 – 最初の要素の位置

この式は、パラメータ文字列が連続した領域の場合有効です。
使用する場合は、このことを確認してください。

strcpyですと
strdupと同様にNULL文字で処理が終わってしまうため
memcpyを用いてコピーします。

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

コメント