メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

CWE Rule 1341

Multiple Releases of Same Resource or Handle

R2023a 以降

説明

ルールの説明

The product attempts to close or release a resource or handle more than once, without any successful open between the close operations.

Polyspace 実装

ルール チェッカーは、[以前に閉じられたリソースを閉じる] をチェックします。

すべて展開する

問題

この問題は、コード内で閉じられ、その後再開されなかったストリームを関数で閉じようとした場合に発生します。

リスク

標準では、FILE* ポインターの値は、それに関連付けられたストリームが閉じられた後に不確定となります。FILE* ポインターで閉じる操作を再度実行すると、望ましくない動作の原因となることがあります。

修正方法

冗長な閉じる操作を削除します。

例 — 以前に閉じられたリソースを閉じる
#include <stdio.h>

void func(char* data) {
    FILE* fp = fopen("file.txt", "w");
    if(fp!=NULL) {
        if(data)
            fputc(*data,fp);
        else
            fclose(fp);
    }
    fclose(fp); //Noncompliant
}

この例では、fpNULL でなく dataNULL である場合、fclose 操作が fp で 2 回続けて発生します。

修正 — 閉じる操作を削除

1 つの修正方法として、後の方の fclose 操作を削除します。リソース リークを回避するために、fclose 操作を if(data) ブロックにも配置しなければなりません。

#include <stdio.h>

void func(char* data) {
    FILE* fp = fopen("file.txt", "w");
    if(fp!=NULL) {
        if(data) {
            fputc(*data,fp);
            fclose(fp);
        }
        else
            fclose(fp);
    }
}

チェック情報

カテゴリ: その他

バージョン履歴

R2023a で導入