Get () официально объявлен устаревшим? - PullRequest
5 голосов
/ 15 сентября 2011

Основываясь на последнем проекте C ++ 11, C ++ ссылается на ISO / IEC 9899: 1999 / Cor.3: 2007 (E) для определения функций библиотеки C (согласно §1.2 [intro.refs] / 1).

На основе самого последнего проекта C99 TC3, The gets function is obsolescent, and is deprecated. (согласно §7.26.9 / 2)

Могу ли я с уверенностью сказать, что gets() устарела как в C, так и в C ++?

Ответы [ 5 ]

4 голосов
/ 15 сентября 2011

Устаревший означает, что вы не должны использовать его, и он может быть удален в будущем.Поскольку оба стандарта говорят, что он устарел, это означает, что он устарел, официально.

3 голосов
/ 15 сентября 2011

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

Редактировать: Хорошо, вот одно безопасное использование gets, о единственном, который я могу вспомнить сразу ...

if (feof(stdin)) gets(buf);

Конечно, некоторые ошибочные реализации (возможно, включая glibc ..?) Разрешают чтение, даже когда индикатор EOF уже установлен для потока, так что ...

1 голос
/ 15 сентября 2011

Даже код, который был бы поврежден удалением get () из библиотеки, после такого удаления был бы менее поврежденным, чем до такого удаления. Я полагаю, что поставщикам компиляторов может быть необходимо включить его в «полностью совместимый со стандартом» режим, но число обстоятельств, при которых его можно безопасно использовать, настолько исчезающе мало, что было бы разумно исключить его из «нормального» "build.

0 голосов
/ 02 августа 2013

Ну, это было полностью удалено из стандарта C11, так что я бы воспринял это как да.

0 голосов
/ 15 сентября 2011

Пройдет некоторое время, пока C ++ 11 не будет реализован повсеместно.

Кроме того, большинство компиляторов еще даже не полностью поддерживает C99.

Например, Microsoft этого не делает.

Так что нет, это не рекомендуется как в C, так и в C ++.

...