バグ:コンソール入力処理でバッファーオーバフロー

Posted: 2013年04月29日

文字列操作(キーボード入力受付)で書いてしまうバグを紹介します。
前回も、キーボード受付処理での話題でしたが
前回とは、異なる関数での話題です。

プログラムプログラム:

 #include <stdio.h>

 int main(int argc, char *argv[])
 {
    TCHAR szBuf[256];

    // 入力要求
    gets(szBuf);

    // 処理

    return 0;
 }

このプログラムにどのように文字列操作(キーボード受付処理)にバグが存在すると思いますか?

  • getsでは、入力文字数の制限ができないため用意したszBufの領域を超えて入力値が設定される

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

 #include <stdio.h>

 int main(int argc, char *argv[])
 {
     TCHAR szBuf[256];

    fgets(stdin, szBuf, sizeof(szBuf) / sizeof(TCHAR));

    // 処理

    return 0;
 }

解説解説:

fgetsで入力文字数の制限が可能です。
関数名とは異なる使用の仕方ですが
元のgetsが使えないのでやも得ないと思ってください。

fgetsは、ファイルからデータを読み込む関数のため
コンソール入力の「stdin」を指定して入力文字列を受け取ります。

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

コメント