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

Использование буфера от функции 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