Имеет ли это значение? Единственный способ, которым вы когда-либо сможете использовать gets
, - это если известно, что stdin
прикреплен к файлу, содержимое которого вы полностью контролируете. Это условие практически невозможно выполнить, особенно в многопроцессорных системах, где другие процессы могут асинхронно изменять файлы по отношению к вашей программе. Следовательно, для всех практических целей любая программа, использующая gets
, имеет неопределенное поведение (т. Е. Существуют возможные исходные данные / условия среды, для которых она будет иметь неопределенное поведение), и в частности UB, которая может привести к компрометации привилегий, если ваша программа имеет более высокие привилегии, чем у поставщика данных.
Редактировать: Хорошо, вот одно безопасное использование gets
, о единственном, который я могу вспомнить сразу ...
if (feof(stdin)) gets(buf);
Конечно, некоторые ошибочные реализации (возможно, включая glibc ..?) Разрешают чтение, даже когда индикатор EOF уже установлен для потока, так что ...