バグ:書式文字列の取得

Posted: 2013年05月06日

文字列操作(書式文字列の酒盗)で書いてしまうバグを紹介します。
sprintfで指定した書式で作成した文字列を取得することが可能です。
知ったかぶりをしていると痛い目にあってしまいます。

プログラムプログラム:

 #include <stdio.h>

 int main(int argc, char *argv[])
 {
    TCHAR strDest[256];
    sprintf(strDest, _T("%s is &d"), "A", 0x41);

    // 処理

    return 0;
 }

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

  • sprintfでは、文字数の制限ができないためバッファーオーバフローする可能性がある

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

 #include <stdio.h>

 int main(int argc, char *argv[])
 {
    TCHAR strDest[256];
    int nDestLegth = snprintf(strDest, 256-1, _T("%s is &d"), "A", 0x41);
    if (nDestLength < 0) {
        // エラー
        return;
    }
    strDest[nDestLegth + 1] = _T('\0'):

    // 処理

    return 0;
 }

解説解説:

snprintfを用いて指定バッファー数まで指定領域に書き込みを行います。
※snprintfまたは、_snprintf 環境によって関数名多少違いがあります。

改善版では、
バッファーサイズに「実サイズ-1」を指定後
最後に「文字数+1」にNULLを設定しています。

sprintfでは、バッファサイズを超えた場合
NULLを設定しないため
使用側でフォローが必要です。

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

コメント