CERT C++: FIO40-C

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

Описание

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

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

Реализация Polyspace

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

Примеры

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

Проблема

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

char * fgets(char* buf, int n, FILE *stream)
следовавший и записанный буфер имеет допустимое содержимое, или вы не сбрасываете буфер на отказе. Вы затем выполняете операцию, которая принимает буфер с допустимым содержимым. Например, если буфером с возможно неопределенным содержимым является buf (как показано выше), средство проверки повышает дефект если:

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

  • Вы возвращаете buf от функции.

  • Вы передаете buf в качестве аргумента к внешним функциям параметром вводят const char * или const wchar_t *.

  • Вы читаете buf как buf[index] или *(buf + offset), где index или offset численное значение, представляющее расстояние с начала буфера.

Риск

Если 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); 
} 

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

Группа: 07. Ввод-вывод (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". УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИЙ НИКАКОГО ВИДА, ИЛИ ОПИСАЛ ИЛИ ПОДРАЗУМЕВАЛ, ОТНОСИТЕЛЬНО ЛЮБОГО ВОПРОСА ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИЛ, ГАРАНТИЯ ПРИГОДНОСТИ ДЛЯ ЦЕЛИ ИЛИ ВЫСОКОГО СПРОСА, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ ЗАКАНЧИВАЕТСЯ ПОЛУЧЕННЫЙ ИЗ ИСПОЛЬЗОВАНИЯ МАТЕРИАЛА. УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИИ НИКАКОГО ВИДА ОТНОСИТЕЛЬНО СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКОГО ПРАВА.

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