バグ:Formatでデバッグメッセージを作っただけなのに

Posted: 2013年02月11日

文字列のフォーマット操作で書いてしまうバグを紹介します。

プログラムプログラム:

 #include <stdio.h>

 int main(int argc, char *argv[])
 {
    CString strFormat;
    strFormat.Format(_T("%s"), 5);

    // 処理

    return 0;
 }

このプログラムにどのように文字列のフォーマット操作にバグが存在すると思いますか?

  • 変換元が数値(5)を指定しているが%sが指定されている
     期待した結果が表示されない

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

 #include <stdio.h>

 int main(int argc, char *argv[])
 {
    CString strFormat;
    strFormat.Format(_T("%d"), 5);

    return 0;
 }

解説解説:

フォーマットの方法と引数が異なると
適切な結果が表示されないまたは、例外が発生する場合があります。

たとえデバッグ用メッセージだとしても実行し結果の確認をすることをおすすめします。
CStringのフォーマットに限らずprintfやscanfについても同様です。

ちなみにCStringのフォーマットはprintfと同様です。
ざっくりどのような種類があるか

指定 対象 説明
%o 整数値(int,short) 8進数で表示
%d,%i 整数値(int short) 10進数で表示
%x,%X 整数値(int short) 16進数で表示 xが小文字 Xが大文字
%u 整数値(int, short) 符号なし10進数で表示
%c 文字(char) 1文字を表示
%s 文字列(char[]) 文字列を表示
%f 実数値(float) 実数値で表示
%e,%E 実数値(float) 実数値を指数表示 eが小文字 Gが大文字
%g,%G 実数値(float) 実数値を表示 通常はfで処理されるが、指数部が-5以下または有効精度以上の場合はe,Eで処理を行う

※lを修飾するとlong,doubleに対応、 llを修飾するとlong long,long doubleに対応

例) %ld, %lld

詳しくは下記のwikipediaを参照
http://ja.wikipedia.org/wiki/Printf

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

コメント