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

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

Описание

Открытие ранее открытого ресурса проверяет на функции открытия файла, которые открывают уже открытый файл.

Риск

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

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

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

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

Фиксация

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

Примеры

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

#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