c: gets() и fputs() являются опасными функциями?
В компьютерной лаборатории в школе мы написали программу, используя fputs
и компилятор вернул ошибку gets is a dangerous function to use
и аналогичная ошибка для fputs
но дома, когда я набираю этот бит кода:
#include <stdio.h>
main()
{
FILE *fp;
char name[20];
fp = fopen("name.txt","w");
gets(name);
fputs(name,fp);
fclose(fp);
}
я не получаю ошибок, что так всегда. Тот в школе был похож на этот, только немного длиннее и имел больше переменных.
Я использую кодовые блоки дома и стандартный gcc, предоставляемый fedora в школе.
Может ли быть проблема с компилятором?
5 ответов
С gets
вам нужно точно знать, сколько символов вы будете читать и, соответственно, использовать достаточно большой буфер. Если вы используете буфер, размер которого меньше содержимого файла, который вы прочитали, вы в конечном итоге будете писать за пределами выделенного буфера, что приведет к неопределенному поведению и недопустимой программе.
Вместо этого вы должны использовать fgets
который позволяет указать, сколько данных для чтения.
Вы не получаете никаких ошибок, потому что, скорее всего, ваш выделенный буфер name
достаточно большой, чтобы вместить содержимое вашего файла name.txt
но если это не так, то это проблема, и, следовательно, компилятор выдает предупреждение.
gets
безусловно, опасно, так как нет способа предотвратить переполнение буфера.
Например, если ваш пользователь ввел 150 символов, это почти наверняка вызовет проблемы для вашей программы. Использование scanf
с неограниченным "%s"
Следует также избегать спецификатора формата для ввода, который вы не можете контролировать.
Тем не менее, использование gets
не должно быть ошибкой, так как это соответствует стандарту. Самое большее, это должно быть предупреждение (если вы, как разработчик, не настраиваете что-то вроде "обрабатывать предупреждения как ошибки").
fputs
хорошо, совсем не опасно.
Смотрите здесь для надежной пользовательской функции ввода, используя fgets
, который можно использовать для предотвращения переполнения буфера.
Это были бы просто разные настройки разных компиляторов. Возможно, компилятор, который использует Codeblocks, не такой многословный или у него отключены предупреждения.
Независимо от компилятора они являются опасными функциями для использования, поскольку они не проверяют переполнение буфера. Вместо этого используйте fgets или fputs.
Остальные ответы все адресованы gets
, что действительно и действительно опасно.
Но вопрос также упоминается fputs
, fputs
функция совершенно безопасна; у него нет таких проблем безопасности.
Я полагаю, что OP, вероятно, ошибся, предположив, что компилятор предупреждал о `fputs.
Что касается проблем, то нет никаких проблем ни с одним из компиляторов. Если вы посмотрите на ссылку, предоставленную Тимоти Джонсом, вы поймете, почему выдается это предупреждение. Что касается разных версий компилятора, компиляторы настроены по-разному, чтобы выдавать разные уровни предупреждения.