exponenta event banner

Использование ранее закрытого ресурса

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

Описание

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

Риск

Стандарт утверждает, что значение 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, появится окно Использование ранее закрытого дефекта ресурса.

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

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