バグ:ファイルパス文字列の操作

Posted: 2013年03月18日

ファイルパス文字列の操作でよく書いてしまうバグを紹介します。

プログラムプログラム:

 #include  <stdio.h>
 #include <stdlib.h>

 int main(int argc, char *argv[])
 {
    CString strFolderPath = _T("C:WindowsSystem32");
    CString strFileName = _T("cmd.exe");

    // 連結
    CString strCmdPath = strFolderPath + strFilePath;

    // 処理

    return 0;
 }

このプログラムにどのようなファイルパス文字列操作関連のバグがあると思いますか?

  • System32のパスをハードコーディングしている(APIを用いて取得していない)
  • FolderPathは末尾に「\」がないため期待しているパスとは異なるパスになっている。

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

 #include  <stdio.h>
 #include <stdlib.h>
 #include <shlwapi.h>

 int main(int argc, char *argv[])
 {
    CString strFolderPath = _T("C:WindowsSystem32");
    CString strFileName = _T("cmd.exe");

    // 連結
    TCHAR szCmdPath[MAX_PATH];
    PathCombine(szCmdPath, strFolderPath, strFilePath);

    // 処理

    return 0;
 }

解説解説:

PathCombine関数を用いるとstrFolerPathとstrFilePathの連結を行います。
関数を用いることで正しく連結される、毎回「\」をしなくてもいいためミスが減ります。

この他にもパス操作関数(Win32 Api)は用意されております。
また、url操作関数も定義されています。

英語で記述されていますが各ファイルパス捜査官数の説明が記述されています。
http://msdn.microsoft.com/en-us/library/windows/desktop/bb773559.aspx

microsoftの日本語ページが存在しても
機械翻訳で意味がわからないページが多いため
英語で読むほうが正しく理解できる。
機械翻訳するくらいなら用意しなくてもいいと思ってしまいますが

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

コメント