CERT C: Rec. FIO11-C

Заботьтесь при определении параметра режима fopen ()

Описание

Управляйте определением

Заботьтесь при определении параметра режима fopen (). [1]

Примеры

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

Описание

Плохой режим доступа к файлу или состояние происходят, когда вы используете функции в fopen или open группа с недопустимыми или несовместимыми режимами доступа к файлу, флагами создания файла или состоянием файла отмечает в качестве аргументов. Например, для open функция, примеры допустимых:

  • Режимы доступа включают O_RDONLY, O_WRONLY, и O_RDWR

  • Флаги создания файла включают O_CREAT, O_EXCL, O_NOCTTY, и O_TRUNC.

  • Флаги состояния файла включают O_APPEND, O_ASYNC, O_CLOEXEC, O_DIRECT, O_DIRECTORY, O_LARGEFILE, O_NOATIME, O_NOFOLLOW, O_NONBLOCK, O_NDELAY, O_SHLOCK, O_EXLOCK, O_FSYNC, O_SYNC и так далее.

Дефект может произойти в следующих ситуациях.

СитуацияРискФиксация

Вы передаете пустой или недопустимый режим доступа fopen функция.

Согласно стандарту ANSI® C, допустимым режимам доступа для fopen :

  • r, r+

  • w, w+

  • a, a+

  • rb, wbA, B

  • r+b, w+b, a+b

  • rb+, wb+, ab+

fopen имеет неопределенное поведение для недопустимых режимов доступа.

Некоторые реализации позволяют расширение режима доступа, такого как:

  • GNU®: rb+cmxe,ccs=utf

  • Визуальный C ++®: a+t, где t задает текстовый режим.

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

Передайте допустимый режим доступа fopen.
Вы передаете флаг O_APPEND состояния к open функция, не комбинируя его ни с одним O_WRONLY или O_RDWR.

O_APPEND указывает, что вы намереваетесь добавить новое содержимое в конце файла. Однако без O_WRONLY или O_RDWR, вы не можете записать в файл.

open функция не возвращается-1 для этой логической ошибки.

Передайте любой O_APPEND|O_WRONLY или O_APPEND|O_RDWR как режим доступа.
Вы передаете флаги состояния O_APPEND и O_TRUNC вместе к open функция.

O_APPEND указывает, что вы намереваетесь добавить новое содержимое в конце файла. Однако O_TRUNC указывает, что вы намереваетесь обрезать файл, чтобы обнулить. Поэтому эти два режима не могут действовать вместе.

open функция не возвращается-1 для этой логической ошибки.

В зависимости от того, что вы намереваетесь сделать, передайте один из этих двух режимов.
Вы передаете флаг O_ASYNC состояния к open функция. На определенных реализациях, режиме O_ASYNC не включает управляемые сигналом операции I/O.Используйте fcntl(pathname, F_SETFL, O_ASYNC); вместо этого.

Фиксация

Фиксация зависит от первопричины дефекта. Часто детали результата показывают последовательность событий, которые привели к дефекту. Можно реализовать закрепление на любом событии в последовательности. Если детали результата не показывают историю события, можно проследить использование, щелкните правой кнопкой по опциям по исходному коду и смотрите предыдущие связанные события. См. также Интерпретируют Результаты Polyspace Bug Finder.

Смотрите примеры мер ниже.

Если вы не хотите устранять проблему, добавьте комментарии в свой результат или код, чтобы избежать другого анализа. Смотрите Результаты Polyspace Адреса Через Исправления ошибок или Выравнивания.

Пример - недопустимый режим доступа с fopen

#include <stdio.h>

void func(void) {
    FILE *file = fopen("data.txt", "rw");
    if(file!=NULL) {
        fputs("new data",file);
        fclose(file);
    }
}

В этом примере, режим доступа rw недопустимо. Поскольку r указывает, что вы открываете файл для чтения и w указывает, что вы создаете новый файл для записи, эти два режима доступа несовместимы.

Коррекция — использует любой r или w как режим доступа

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

#include <stdio.h>

void func(void) {
    FILE *file = fopen("data.txt", "w");
    if(file!=NULL) {
        fputs("new data",file);
        fclose(file);
    }
}

Проверяйте информацию

Группа: Rec. 09. Ввод-вывод (FIO)

Введенный в R2019a


[1]  Это программное обеспечение было создано MathWorks, включающим фрагменты: “Веб-сайт SEI CERT-C”, © 2017 Carnegie Mellon University, веб-сайт SEI CERT-C © 2017 Carnegie Mellon University”, CERT SEI C Кодирование Стандарта – Правил для Разработки безопасных, Надежных и Защищенных систем – 2 016 Выпусков”, © 2016 Carnegie Mellon University, and “CERT SEI Стандарт Кодирования C++ – Правил для Разработки безопасных, Надежных и Защищенных систем на C++ – 2 016 Выпусков” © 2016 Carnegie Mellon University, со специальным разрешением от его Института программной инженерии.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ-МЕЛЛОН И/ИЛИ ЕГО ИНСТИТУТА ПРОГРАММНОЙ ИНЖЕНЕРИИ СОДЕРЖАЛ, ЗДЕСЬ ПРЕДОСТАВЛЯЕТСЯ НА ОСНОВЕ "ASIS". УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИЙ НИКАКОГО ВИДА, ИЛИ ВЫРАЗИЛ ИЛИ ПОДРАЗУМЕВАЛ, ОТНОСИТЕЛЬНО ЛЮБОГО ВОПРОСА ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИЛ, ГАРАНТИЯ ПРИГОДНОСТИ ДЛЯ ЦЕЛИ ИЛИ ВЫСОКОГО СПРОСА, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ ЗАКАНЧИВАЕТСЯ ПОЛУЧЕННЫЙ ИЗ ИСПОЛЬЗОВАНИЯ МАТЕРИАЛА. УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИИ НИКАКОГО ВИДА ОТНОСИТЕЛЬНО СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКОГО ПРАВА.

Это программное обеспечение и сопоставленная документация не были рассмотрены, ни являются подтвержденным Университетом Карнеги-Меллон или его Институтом программной инженерии.