Use of indeterminate string

Использование буфера из функции семейства fgets

Описание

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

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

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

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

Риск

Если задан 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); 
} 

Информация о результатах

Группа: Программирование
Язык: C | C++
По умолчанию: Off
Синтаксис командной строки : INDETERMINATE_STRING
Влияние: Средний
Введенный в R2017b