Use of previously closed resource

Функция работает с ранее закрытым потоком

Описание

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

Риск

Стандарт утверждает, что значение FILE* указатель неопределенен после закрытия связанного с ним потока. Операции с использованием FILE* указатель может привести к непреднамеренным результатам.

Зафиксировать

Одним из возможных исправлений является закрытие потока только в конце операций. Другое исправление - снова открыть поток перед его повторным использованием.

Примеры

расширить все

#include <stdio.h>

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

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

В этом примере fclose закрывает поток, сопоставленный с fp. Когда вы используете fprintf на fp после fcloseпоявляется Use of previously closed resource дефект.

Коррекция - Закрытие потока после всех операций

Одной из возможных коррекций является изменение порядка fprintf и fclose операции.

#include <stdio.h>

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

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

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

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