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