Предупреждение: функция становится опасной

Когда я использую функцию get, gcc дает мне предупреждение:

warning:the `gets' function is dangerous and should not be used.

Почему функция get и put опасна?

Ответы

Ответ 1

Если у вас есть такой код:

char s[10];
gets( s );

и при запуске программы вы вводите более 10 символов, вы будете переполнять буфер, вызывая поведение undefined. Функция gets() не имеет возможности помешать вам вводить символы, и поэтому этого следует избегать. Вместо этого вы должны использовать fgets(), который позволяет вам ограничить количество прочитанных символов, чтобы буфер не переполнялся.:

char s[10];
fgets( s, 10, stdin );

Функция puts() совершенно безопасна, если строка, которую вы выводите, завершает нуль.

Ответ 2

Потому что gets не ограничивает объем данных, которые он читает, и поэтому уязвим для переполнения буфера. Ответ @Neil имеет соответствующее решение.

Функция puts не опасна, AFAIK, если, конечно, вы не забудете ее оканчивать на нуль.

Ответ 3

Как Статья в Википедии говорит, gets() по своей сути небезопасна, потому что все, что требуется, это char * в качестве аргумента.

Это опасно, поскольку метод не знает, сколько места было выделено для этого char * в любой ситуации. Поэтому gets ведет себя так, как если бы у него была пустая проверка, чтобы записать как можно больше данных, что может привести к переполнению буфера.

Альтернативой является fgets, который принимает не только массив символов, но и максимальную длину и указатель потока. gets поддерживается только для обратной совместимости со старым кодом.

Ответ 4

Переполнение буфера опасно. Здесь определение:

/* Get a line from the stdin stream. */
char *gets(char *buffer);

Насколько велик буфер? Если пользователь вводит больше данных, которые могут вписываться в буфер, программа может быть повреждена и подвержена атакам хакера.

Ответ 5

Gets не проверяет переполнение буфера, подвергая ваш код атаке

Ответ 6

gets считывает данные в заданную область памяти до появления новой строки или конца файла. Если вход (например, предоставленный пользователем) содержит строку длиннее, чем размер буфера, поданного на gets, он будет переполняться и будет записываться в память за пределами буфера. В худшем случае это может позволить злонамеренному пользователю писать данные, которые изменяют поведение программы или, возможно, даже выполняет произвольный код с привилегиями этой программы (например, тот, который может работать на удаленном сервере или с привилегиями другого пользователя) и даже случайные переполнения, скорее всего, нарушат программное обеспечение.

fgets следует использовать вместо этого, поскольку для ограничения размера ввода требуется дополнительный аргумент.