Закрытие ранее закрытого ресурса

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

Описание

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

Риск

Стандарт утверждает, что значение указателя 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++
Значение по умолчанию: на
Синтаксис командной строки: DOUBLE_RESOURCE_CLOSE
Влияние: высоко
ID CWE: 672, 826, 910

Введенный в R2015b