Opening previously opened resource

Открытие уже открытого файла

Описание

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

Риск

Если вы открываете ресурс многократно, можно столкнуться:

  • Состояние состязания при доступе к файлу.

  • Неопределенное или неожиданное поведение для того файла.

  • Мобильность выходит, когда вы запускаете свою программу на различных целях.

Фиксация

Если ресурс открыт, закройте ресурс перед повторным открытием.

Примеры

развернуть все

#include <stdio.h>
const char* logfile = "my_file.log";

void doubleresourceopen()
{
    FILE* fpa = fopen(logfile, "w");
    if (fpa == NULL) {
        return;
    }
    (void)fprintf(fpa, "Writing");
    FILE* fpb = fopen(logfile, "r");
    (void)fclose(fpa);
    (void)fclose(fpb);
}

В этом примере, logfile открыт в первой линии этой функции с привилегиями записи. На полпути через функцию, logfile открыт снова с привилегиями чтения.

Коррекция — закрывается перед повторным открытием

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

#include <stdio.h>
const char* logfile = "my_file.log";

void doubleresourceopen()
{
    FILE* fpa = fopen(logfile, "w");
    if (fpa == NULL) {
        return;
    }
    (void)fprintf(fpa, "Writing");
    (void)fclose(fpa);
    FILE* fpb = fopen(logfile, "r");
    (void)fclose(fpb);
}

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

Группа: управление ресурсами
Язык: C | C++
Значение по умолчанию: На для рукописного кода, прочь для сгенерированного кода
Синтаксис командной строки: DOUBLE_RESOURCE_OPEN
Удар: носитель
ID CWE: 362, 413, 675
Введенный в R2017b