バグ:ファイルの更新時刻に2038年問題がある

Posted: 2013年08月14日

ファイルの更新時刻する際によく書いてしまうバグを紹介します。

今回は、64bit環境が前提として記載しています。

プログラムプログラム:

 #include  <stdio.h>
 #include  <Windows.h>

 int main(int argc, char *argv[])
 {
     FILE *fp;
     fp = fopen(argv[1],"r");
     if (fp == NULL) {
        // ファイルが開けない
        return 1;
     }

    struct stat sStat;
    fstat(fp, &sStat);

    // 処理

    return 0;
 }

このプログラムにどのようなファイル更新時刻取得のバグがあると思いますか?

  • fstatでは、32bitで処理がされるためビルドエラーとなる。

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

 #include  <stdio.h>
 #include  <Windows.h>
 #include  <imagehlp.h>

 int main(int argc, char *argv[])
 {
     FILE *fp;
     fp = fopen(argv[1],"r");
     if (fp == NULL) {
        // ファイルが開けない
        return 1;
     }

     struct _stati64 sStat;
     _fstati64(fp, &sStat);

     // 処理

     return 0;
 }

解説解説:

ビルド環境にもよるとは思いますが

ビルド時にエラーまたは、警告が出ると思います。

fstatでは、時刻が32bitの領域の構造体を返すため
実際に時刻を処理する際には、サイズが異なるため

エラーが出ると思います。
エラーが出ない場合は、期待する動作と異なる挙動をするでしょう
2038年問題など‥

_fstati64を用いると時刻とファイルサイズが64bitの領域で処理がされます。
使用する環境によってサマザマな巻数があるためこの関数がベストというわけではないですし。

すべて32bitでやるばあいは、この問題が発生しないため
無視していただいて構いません。

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

コメント