Use of indeterminate string

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

Описание

Этот дефект происходит, когда вы не проверяете если операция записи с помощью 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- функция семейства к известному значению строки, когда функция перестала работать.

Примеры

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

#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