バグ:ファイルパスをコピーしたため間違っていませんけど

Posted: 2013年02月25日

文字列操作?エスケープ文字列で書いてしまうバグを紹介します。

プログラムプログラム:

 #include <stdio.h>

 int main(int argc, char *argv[])
 {
    CString strSrc = _T("C:temp"); // 全角空白

    // 処理

    return 0;
 }

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

  • フォルダのパスはそのまま設定すると、Wがエスケープ文字扱いになるため
     意図道理に動作しない

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

 #include <stdio.h>

 int main(int argc, char *argv[])
 {
    CString strSrc = _T("C:temp"); // 全角空白

    // 処理

    return 0;
 }

解説解説:

「t」はタブを表すため「C:emp」のファイルパスが設定されたことになります。
エスケープシーケンスには様々なものが存在します。
存在しないものは、ビルドエラーになるためこの問題に気がつくことができますが
(無効なエスケープシーケンスが指定されました)
存在するものは、そのまま処理がされるため実行時に、動作がおかしいと思い気が付くしかありません

エスケープシーケンス一覧

エスケープシーケンス 説明
a ビープ音を鳴らします
b BackSpaceと同様、1文字前の文字を削除
f 改ページ
n 改行文字(Line field)
r 改行文字(Carrige Return)
t タブ(水平)
v タブ(垂直)
\ 文字扱いの
? 文字扱いの?
文字扱いの’
文字扱いの”
NULL文字 値は0
<数値> 8進数の文字 10=8
x<数値> 16進数の文字 1F=31

改善コードでは、
「W」を「\W」にすることで
「」を文字扱いにしています。
パスをそのままコピーしてしまいますが
気をつけるここに関しては注意が必要です。

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

コメント