メインコンテンツ

以前に閉じられたリソースを使用しています

関数が、以前に閉じられたストリームで動作

説明

この欠陥は、コード内で閉じられていたストリームに対して関数が実行された場合に発生します。

リスク

標準では、FILE* ポインターの値は、それに関連付けられたストリームが閉じられた後に不確定となります。FILE* ポインターを使用する操作により、想定外の結果につながることがあります。

修正方法

1 つの修正方法として、ストリームを操作の終了時にのみ閉じます。別の修正方法として、ストリームを再使用する前に再び開きます。

すべて展開する

#include <stdio.h>

void func(void) {
    FILE *fp;
    void *ptr;

    fp = fopen("tmp","w");
    if(fp != NULL) {
        fclose(fp);
        fprintf(fp,"text");
    }
}

この例では、fp に関連付けられているストリームを fclose で閉じています。fp に対し fprintffclose の後に使用すると、[以前に閉じられたリソースを使用しています] の欠陥が発生します。

修正 — すべての操作の後にストリームを閉じる

1 つの修正方法として、fprintffclose の操作の順序を逆にします。

#include <stdio.h>

void func(void) {
    FILE *fp;
    void *ptr;

    fp = fopen("tmp","w");
    if(fp != NULL) {
        fprintf(fp,"text");
        fclose(fp);
    }
}

結果情報

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

バージョン履歴

R2015b で導入