CERT C: Rule FIO40-C

Сбросьте строки на отказе fgets () или fgetws ()

Описание

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

Сбросьте строки при отказе fgets () или fgetws ().[1]

Реализация Polyspace

Эта проверка проверяет Использование неопределенной строки.

Примеры

расширить все

Проблема

Использование неопределенной строки происходит, когда вы не проверяете валидность буфера, возвращенного из fgets-семейные функции. Шашка поднимает дефект, когда используется такой буфер, как:

  • Аргумент в стандартных функциях, которые печатают или манипулируют строками или широкими строками.

  • А возврат значение.

  • Аргумент во внешних функциях с типом параметра const char * или const wchar_t *.

Риск

Если задан fgets-семейство функция прекращает работать, содержимое ее выходного буфера неопределенно. Использование такого буфера имеет неопределенное поведение и может привести к работе программы или другим уязвимостям безопасности.

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

Сбросьте выходной буфер fgets- функция семейства к известному строковому значению, когда функция прекращает работать.

Пример - Выход fgets() Передан во внешнюю функцию
#include <stdio.h>
#include <wchar.h>
#include <string.h>
#include <stdlib.h>

#define SIZE20 20

extern void display_text(const char *txt);

void func(void) {
    char buf[SIZE20];
	
	/* Check fgets() error */
    if (fgets (buf, sizeof (buf), stdin) == NULL)
    {
        /* 'buf' may contain an indeterminate string.  */
        ;
    }
	/* 'buf passed to external function */
    display_text(buf); 
}
        
      

В этом примере выход buf передается во внешнюю функцию display_text(), но его значение не сбрасывается, если fgets() сбой.

Коррекция - Сброс fgets() Выход по ошибке

Если fgets() отказывает, сбрасывает buf к известному значению перед передачей его во внешнюю функцию.

#include <stdio.h>
#include <wchar.h>
#include <string.h>
#include <stdlib.h>

#define SIZE20 20

extern void display_text(const char *txt);

void func1(void) {
    char buf[SIZE20];
	/* Check fgets() error */
    if (fgets (buf, sizeof (buf), stdin) == NULL)
    {
		/* value of 'buf' reset after fgets() failure. */
        buf[0] = '\0';
    }
	/* 'buf' passed to external function */
    display_text(buf); 
} 

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

Группа: Правило 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 Университет Карнеги Меллон, с специального разрешения от его Института программной инженерии.

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

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