Предупреждение: функция становится опасной
Когда я использую функцию 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
следует использовать вместо этого, поскольку для ограничения размера ввода требуется дополнительный аргумент.
Ответ 7
См. http://www.c-faq.com/stdio/getsvsfgets.html