メインコンテンツ

以前に開いたリソースを開く

既に開いているファイルを開く

説明

この欠陥は、fopen などのファイル処理関数が、過去に開かれ、その後閉じられていないファイルを開いた場合に発生します。

リスク

リソースを複数回開くと、以下が発生する可能性があります。

  • ファイル アクセス時の競合状態。

  • そのファイルに対する未定義の動作または予期しない動作。

  • 異なるターゲットでプログラムを実行するときの移植性の問題。

修正方法

リソースを開いたら、再度開く前にそのリソースを閉じます。

すべて展開する

#include <stdio.h>
const char* logfile = "my_file.log";

void doubleresourceopen()
{
    FILE* fpa = fopen(logfile, "w");
    if (fpa == NULL) {
        return;
    }
    (void)fprintf(fpa, "Writing");
    FILE* fpb = fopen(logfile, "r");
    (void)fclose(fpa);
    (void)fclose(fpb);
}

この例では、この関数の最初の行で書き込み権限を指定して logfile を開きます。この関数の途中で、読み取り権限を指定して logfile を再び開きます。

修正 — 再度開く前に閉じる

考えられる 1 つの修正方法として、異なる権限を指定してファイルを再度開く前に、そのファイルを閉じます。

#include <stdio.h>
const char* logfile = "my_file.log";

void doubleresourceopen()
{
    FILE* fpa = fopen(logfile, "w");
    if (fpa == NULL) {
        return;
    }
    (void)fprintf(fpa, "Writing");
    (void)fclose(fpa);
    FILE* fpb = fopen(logfile, "r");
    (void)fclose(fpb);
}

結果情報

グループ: リソース管理
言語: C | C++
既定値: 手書きコードはオン、生成コードはオフ
コマンド ライン構文: DOUBLE_RESOURCE_OPEN
影響度: Medium

バージョン履歴

R2016b で導入