とあるC++ソースの不具合を調査をしていたところ、おかしな動きをしている箇所があった。
サンプルソース
// 変数宣言
char strA[] = "12345678";
char strB[8];
char ret[16];
// 初期化
memset(strB, 0x00, sizeof(strB));
memset(ret, 0x00, sizeof(ret));
// "12345678"をchar[8]の配列にコピー
memcpy(strB, strA, sizeof(strB));
// char[8]の内容をシングルクォーテーションで囲ってchar[16]の配列へ
sprintf(ret, "'%s'", strB);
// char[16]の配列を返す
return ret;
こんな感じのソースで、retの値に「’12345678’」が入ることを期待していたんだけど、変な値で返ってくる…。
サンプルソースで書いてしまえば一目瞭然なんだけど、実際のソースはもっと複雑なのと、SDLチェックも外されていたので、原因に気付くまで時間がかかった。