Closing a previously closed resource

Функция закрывает ранее закрытый поток

Описание

Этот дефект возникает, когда функция пытается закрыть поток, который был закрыт ранее в вашем коде и не открыт позже.

Риск

Стандарт утверждает, что значение 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);
}

В этом примере, если fp не NULL и data является NULL, а fclose операция происходит на fp дважды последовательно.

Коррекция - Удаление операции закрытия

Одной из возможных коррекций является удаление последнего 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);
    }
}

Информация о результатах

Группа: Управление ресурсами
Язык: C | C++
По умолчанию: On для рукописного кода, off для сгенерированного кода
Синтаксис командной строки: DOUBLE_RESOURCE_CLOSE
Влияние: Высокий
ИДЕНТИФИКАТОР CWE: 672, 826, 910
Введенный в R2015b