2017-02-20 5 views
0

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

undefined reference to gets_s 

This page says something about the gets_s, функции, что я не очень понимаю о нем определяется в ISO/IEC 99. Разве это не работает со всеми компиляторами? Я почти уверен, что использую очень недавнюю версию компилятора MinGW.

Как использовать эту функцию? Использует ли get() или scanf() (вместо scanf_s()) или fgets() над fgets_s(), а не хорошо?

+2

«Не должно работать со всеми компиляторами». Нет, это не стандартная функция С. Это специфичная Microsoft, поэтому в основном нужна Visual Studio. – kaylum

+0

@kaylum, отличается ли «ANSI C» от ​​стандартного «Microsoft»? – BumbleBee

+0

@kaylum, это нормально, чтобы не узнать об этих стандартах? Как получить дополнительную информацию о типичном количестве доступных стандартов? – BumbleBee

ответ

2

yes Вы правы #bumblebee Функция gets() не выполняет проверку границ, поэтому эта функция чрезвычайно уязвима для атак с переполнением буфера. Его нельзя использовать безопасно (если программа не работает в среде, которая ограничивает то, что может появиться на stdin). По этой причине функция была устарела в третьем исправлении к стандарту C99 и полностью удалена в стандарте C11. fgets() и gets_s() являются рекомендуемыми заменами. Никогда не используйте gets().

источник: http://en.cppreference.com/w/c/io/gets проверить погоду, в которую вы вошли соответствующий заголовок. и еще одна вещь, которую вы должны видеть, - это то, что погода в версии компилятора - это обновленная версия или старая версия, которая также может создать проблему. Попробуйте в стандарте c11 или онлайн-компилятор c11.

+0

выше в комментариях сказано, что эта функция является «специфичной для Microsoft», как узнать типичное количество доступных стандартов? – BumbleBee

+0

, и нужно ли нам изучать все эти стандарты, чтобы быть хорошим программистом на C? – BumbleBee

+0

Является ли MinGW не компилятором C11? – BumbleBee

0

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

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

Функция полностью удалена из языка стандарта C11, что означает, что для исправления устаревшего кода был очень щедрый период перехода не менее 12 лет. Он был заменен на gets_s, что является безопасной альтернативой для переноса старого кода на C11. В качестве второго параметра требуется размер буфера.

Однако gets_s следует использовать только для таких причин портирования C11, если вообще существует. gets_s является частью дополнительного интерфейса проверки границ в C11, и компиляторы не должны его реализовывать. Стандарт C11 рекомендует использовать fgets вместо:

Recommended practice
The fgets function allows properly-written programs to safely process input lines too long to store in the result array. In general this requires that callers of fgets pay attention to the presence or absence of a new-line character in the result array. Consider using fgets (along with any needed processing based on new-line characters) instead of gets_s.


Обратите внимание, что gets_s имеет мало общего с нестандартным Visual Studio компилятор, несмотря на то, что компилятор случается поддерживает эту функцию, так же, как стандартный СООТВЕТСТВИЕ компиляторы, которые поддерживают интерфейс проверки границ (__STDC_LIB_EXT1__).

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