2010-05-16 3 views
14

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

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

Почему получает и ставит функция опасно?

+18

В 'путы()' функция * не * опасно. Почему вы спрашиваете о 'puts()' тоже? –

ответ

45

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

char s[10]; 
gets(s); 

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

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

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

+6

'fgets' не отбрасывает символы. Это оставляет их непрочитанными. Последующие вызовы 'fgets' или любой другой функции чтения могут читать оставшиеся символы. –

+0

@R. Правда - я отредактирую свой ответ. BTW, R. не является хорошим или разумным именем пользователя SO. – 2010-07-07 19:37:40

4

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

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

1

получает не проверяет переполнение буфера подвергая свой код, чтобы атаковать

2

Как Wikipedia's article says, это по своей сути небезопасно, потому что все, что требуется, это char * в качестве аргумента.

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

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

2

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

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

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

1

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

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

Смежные вопросы