バグ:文字列の連結

Posted: 2013年04月08日

文字列操作(文字列の連結)でよくあるバグを紹介します。
定番であるため、あるため様々な対策が行われているので
発生しづらい項目
新人研修で作成したプログラムには作りこんでしまうかもくらいなもの

プログラムプログラム:

 #include <stdio.h>

 int main(int argc, char *argv[])
 {
    TCHAR szData[16];

    for (int nIndex=1; nIndex < 16; nIndex++) {
        _tcsncat(szData, _T("ABC"), 3);
    }

    // 処理

    return 0;
 }

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

  • バッファーオーバーランが発生している

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

 #include <stdio.h>

 int main(int argc, char *argv[])
 {
    CString strData;

    for (int nIndex=1; nIndex < 16; nIndex++) {
        strData += _T("ABC");
    }

    // 処理

    return 0;
 }

解説解説:

_tcsncatで文字数を指定しているため
APIが正しく処理してくれそうな錯覚をしますが
 ※個人的にはしてました

連結先のサイズは指定していないため超えた場合は、バッファーオーバーラン(配列の領域以上の書き込み)が発生します。
C++の場合は、文字列クラスをお持ちいることで対応可能です。

Cの場合は、環境にもよりますが_tcscat_s関数を用いることで安全に処理が行われます。

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

コメント