バグ:日付を文字列に変換

Posted: 2013年05月13日

文字列操作(日付を文字列に変換)で書いてしまうバグを紹介します。

プログラムプログラム:

 #include <stdio.h>

 int main(int argc, char *argv[])
 {
    time_t timer;
    struct tm *pTm;

    /* 現在時刻の取得 */
    time(&timer);

    /* 現在時刻を構造体に変換 */
    pTm = localtime(&timer);

    TCHAR *pszTime;
    pszTime = _tasctime(pTm);

    // 処理

    if (pszTime != NULL) {
        delete[] pszTime;
    }

    return 0;
 }

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

  • asctimeの返却値は、内部で確保されているstatic領域のため開放の必要がないのに開放している

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

 #include <stdio.h>

 int main(int argc, char *argv[])
 {
    time_t timer;
    struct tm *pTm;

    /* 現在時刻の取得 */
    time(&timer);

    /* 現在時刻を構造体に変換 */
    pTm = localtime(&timer);

    TCHAR *pszTime;
    pszTime = _tasctime(pTm);

    // 処理

    return 0;
 }

解説解説:

asctimeでは、static領域を返すため
再度呼び出した場合は、結果が変わります。

後々もその値を使う用であれば
自身で領域を確保しコピーしておくと安全です

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

コメント