exponenta event banner

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

Использование буфера из функции fgets-family

Описание

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

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

  • Возвращаемое значение.

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

Риск

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

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

Сброс выходного буфера fgetsФункция -family получает известное строковое значение при сбое функции.

Примеры

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

#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++
По умолчанию: Откл.
Синтаксис командной строки: INDETERMINATE_STRING
Воздействие: среднее
Представлен в R2017b