バグ:CSVなどの文字を解析

Posted: 2013年01月21日

文字列解析中(CSV等)に間違えてよく書いてしまうバグを紹介します。

プログラムプログラム:

 #include <stdio.h>

 int main(int argc, char *argv[])
 {
    const TCHAR *pszSrc = _T("AAA,BBB,CCC");
    CStringArray aryResult;

    char *pPosition = _tcstok(pszSrc, _T(",");
    while (pPosition != NULL) {
        pPosition = _tcstok(pszSrc, _T(",");
        aryResult.Add(pPosition);
    }

    return 0;
 }

このプログラムにどのように文字列解析処理を間違えていると思いますか?

  • _tcstokの引数を間違えているため正常に動作を行わない(無限ループ)

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

 #include <stdio.h>

 int main(int argc, char *argv[])
 {
    const TCHAR *pszSrc = _T("AAA,BBB,CCC");
    CStringArray aryResult;

    char *pPosition = _tcstok(pszSrc, _T(",");
    while (pPosition != NULL) {
        pPosition = _tcstok(NULL, _T(",");
        aryResult.Add(pPosition);
    }

    return 0;
 }

解説解説:

while文の_tcstok関数の第一引数をNULLに設定しています。
_tcstok関数内で始めに呼び出したpszSrcの内容を記憶しているためです。
記憶した値を使用して処理を続けるためには、引数にNULLを渡す実装になっています。

このことがわかっていても以下の場合問題となります。

  • while文の中で関数を呼び出しその関数内で_tcstokを使用している場合
  • マルチスレッド処理を起こっている場合

_tcstok(strtok, wcstok)を使用することはやめたほうがいいです。
似たような処理を独自に実装する必要があります。

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

コメント