Когда я использую получает функцию, НКУ дает мне предупреждение:предупреждения: получает функцию опасно
warning:the `gets' function is dangerous and should not be used.
Почему получает и ставит функция опасно?
Когда я использую получает функцию, НКУ дает мне предупреждение:предупреждения: получает функцию опасно
warning:the `gets' function is dangerous and should not be used.
Почему получает и ставит функция опасно?
Если у вас есть такой код:
char s[10];
gets(s);
и вы наберете в более чем 10 символов, когда программа запущена, вы будете переполняет буфер, вызывая неопределенное поведение. Функция gets() не имеет возможности помешать вам вводить символы, и поэтому этого следует избегать. Вместо этого вы должны использовать fgets(), который позволяет ограничить число считанных символов, так что буфер не переполнится .:
char s[10];
fgets(s, 10, stdin);
The путы() функция совершенно безопасна, при условии строка, вы выводите нулевое завершение.
'fgets' не отбрасывает символы. Это оставляет их непрочитанными. Последующие вызовы 'fgets' или любой другой функции чтения могут читать оставшиеся символы. –
@R. Правда - я отредактирую свой ответ. BTW, R. не является хорошим или разумным именем пользователя SO. – 2010-07-07 19:37:40
Потому что gets
не ограничивает объем данных, которые он читает, и поэтому уязвим для переполнения буфера. @ Ответ Нила имеет соответствующее решение.
Функция puts
не является опасной, AFAIK, если, конечно, вы не забудете ее обнулить.
получает не проверяет переполнение буфера подвергая свой код, чтобы атаковать
Как Wikipedia's article says, это по своей сути небезопасно, потому что все, что требуется, это char *
в качестве аргумента.
Это опасно, поскольку метод не знает, сколько места было выделено для этого char *
в любой ситуации. Поэтому gets
ведет себя так, как будто он имеет пустую проверку, чтобы записать как можно больше данных, что может привести к переполнению буфера.
Альтернатива fgets
, которая принимает не только массив символов, но и максимальную длину и указатель потока. gets
поддерживается только для обратной совместимости со старым кодом.
Переполнение буфера опасно. Вот определение:
/* Get a line from the stdin stream. */
char *gets(char *buffer);
Насколько велик буфер? Если пользователь вводит больше данных, которые могут вписываться в буфер, программа может быть повреждена и подвержена атакам хакера.
gets
считывает данные в заданную область памяти до появления новой строки или конца файла. Если вход (например, предоставленный пользователем) содержит строку длиннее, чем размер буфера, поданного на gets
, он будет переполняться и будет записываться в память за пределами буфера. В худшем случае это может позволить злонамеренному пользователю писать данные, которые изменяют поведение программы или, возможно, даже выполняет произвольный код с привилегиями этой программы (например, тот, который может работать на удаленном сервере или с привилегиями другого пользователя) и даже случайные переполнения, скорее всего, нарушат программное обеспечение.
fgets
следует использовать вместо этого, поскольку для ограничения размера ввода требуется дополнительный аргумент.
В 'путы()' функция * не * опасно. Почему вы спрашиваете о 'puts()' тоже? –