バグ:文字列配列の初期化でゴミが残る

Posted: 2013年06月24日

文字列操作(文字列の初期化)で書いてしまうバグを紹介します。

プログラムプログラム:

 #include <stdio.h>
 #include <string.h>

 int main(int argc, char *argv[])
 {
    TCHAR strDest[256];
    strset(szDest, NULL);

    // 処理

    return 0;
 }

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

  • strDestの内容によりすべてが初期化されない場合がある

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

 #include <stdio.h>

 int main(int argc, char *argv[])
 {
    TCHAR strDest[256];
    memset(strDest , NULL, 256);

    // 処理

    return 0;
 }

解説解説:

定義した状態では配列の状態がどのようになっているか不明です。
もちろん他の設定によって初期化はできますが
一例として受け取ってください

配列内にNULLが含まれる場合は、
そこまでしかstrsetが動作しません。

その場合は、memsetを用いて行うと正しく設定されます。

文字列と思い扱うと痛い目に会います。

今回の処理では、メモリークリアであり
混同しがちですが

メモリー操作は、
memを使用したほうが安全と考えたほうがいいでしょう
もちろんstr
も有効に動作するため
自分の技術力次第という事で

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

コメント