exponenta event banner

CERT C: FIO38-C правил

Не копировать объект FILE

Описание

Определение правила

Не копировать объект FILE. [1 ]

Внедрение Polyspace

Эта проверка проверяет, не используется ли объект FILE.

Примеры

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

Проблема

Неправильное использование объекта FILE происходит в следующих случаях:

  • Удаление ссылки на объект FILE, включая косвенное удаление ссылки с помощью memcmp().

  • С помощью указателя можно изменить весь объект FILE или один из его компонентов.

  • Вы берете адрес объекта FILE, который не был возвращен при вызове fopen- функция семейства. Дефект не возникает, если макрос определяет указатель как адрес встроенного объекта FILE, например #define ptr (&__stdout).

Риск

В некоторых реализациях адрес указателя на объект FILE, используемый для управления потоком, является значимым. Указатель на копию объекта FILE интерпретируется иначе, чем указатель на исходный объект, и потенциально может привести к операциям с неправильным потоком. Поэтому использование копии объекта FILE может привести к тому, что программное обеспечение перестанет отвечать, что злоумышленник может использовать при атаках типа «отказ в обслуживании».

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

Не создавайте копию объекта FILE. Не используйте адрес объекта FILE, который не был возвращен при успешном вызове fopen- функция семейства.

Пример - Копия объекта FILE, используемого в fputs()
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>

void fatal_error(void);

int func(void)
{
	/*'stdout' dereferenced and contents
        copied to 'my_stdout'. */
    FILE my_stdout = *stdout;  
	
	/* Address of 'my_stdout' may not point to correct stream. */
    if (fputs("Hello, World!\n", &my_stdout) == EOF)  
    {
        /* Handler error */
        fatal_error();
    }
    return 0;
}
        
      

В этом примере объект FILE stdout обнуляется, и его содержимое копируется в my_stdout. Содержание stdout может быть несущественным. fputs() затем вызывается с адресом my_stdout в качестве аргумента. Потому что нет вызова fopen() или была сделана аналогичная функция, адрес my_stdout может не указывать на правильный поток.

Исправление - копирование указателя объекта FILE

Объявить my_stdout указать на тот же адрес, что и stdout для обеспечения записи в правильный поток при вызове fputs().

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>

void fatal_error(void);

int func(void)
{
	/* 'my_stdout' and 'stdout' point to the same object. */
    FILE *my_stdout = stdout;  
    if (fputs("Hello, World!\n", my_stdout) == EOF)
    {
        /* Handler error */
        fatal_error();
    }
    return 0;
} 

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

Группа: Правило 09. Входной выход (FIO)
Представлен в R2019a

[1] Данное программное обеспечение было создано компанией MathWorks и включает в себя следующие компоненты: «Веб-сайт SEI CERT-C», © 2017 Университет Карнеги-Меллон, веб-сайт SEI CERT-C + + © 2017 Университет Карнеги-Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги-Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги-Меллон, со специальным разрешением от его Института программного обеспечения.

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

Данное программное обеспечение и связанная с ним документация не были рассмотрены и не одобрены Университетом Карнеги-Меллона или его Институтом разработки программного обеспечения.