c: gets () и fputs () опасные функции? - PullRequest
1 голос
/ 19 января 2012

В компьютерной лаборатории в школе мы написали программу, используя 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 ]

2 голосов
/ 19 января 2012

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

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

Вы не получаете никаких ошибок, потому что скорее всего ваш выделенный буфер name достаточно большойдержать содержимое вашего файла name.txt, но если это не так, то это проблема, и, следовательно, компилятор выдает предупреждение.

1 голос
/ 19 января 2012

Это были бы просто разные настройки разных компиляторов.Возможно, компилятор, который использует Codeblocks, не такой многословный или у него отключены предупреждения.

Независимо от компилятора, они являются опасными функциями для использования, поскольку они не проверяют переполнение буфера.Вместо этого используйте fgets или fputs.

1 голос
/ 19 января 2012

gets, безусловно, опасно, поскольку нет способа предотвратить переполнение буфера.

Например, если ваш пользователь ввел 150 символов, это почти наверняка вызовет проблемы для вашей программы. Следует также избегать использования scanf с неограниченным спецификатором формата "%s" для ввода, который вы не можете контролировать.

Однако использование gets должно не быть ошибкой, поскольку оно соответствует стандарту. На most, это должно быть предупреждение (если вы, как разработчик, не настроите что-то вроде «обрабатывать предупреждения как ошибки»).

fputs хорошо, совсем не опасно.

См. здесь для надежной пользовательской функции ввода, используя fgets, которая может использоваться для предотвращения переполнения буфера.

0 голосов
/ 17 марта 2018

Все остальные ответы адресованы gets, что действительно и действительно опасно.

Но в вопросе также упоминается fputs.Функция fputs абсолютно безопасна;у него нет такого рода проблем безопасности.

Я полагаю, что OP, вероятно, ошибся, предположив, что компилятор предупреждал о `fputs.

0 голосов
/ 19 января 2012

Что касается проблем, то нет проблем ни с одним из компиляторов. Если вы посмотрите на ссылку, предоставленную Тимоти Джонсом, вы поймете, почему выдается это предупреждение. Что касается разных версий компилятора, компиляторы настроены по-разному, чтобы выдавать разные уровни предупреждения.

...