Примечание: я только что понял, что заголовок вашего вопроса кажется неуместным - вы получили предупреждение от macOS о выполнении программы, которая использует gets()
. Это не имеет ничего общего с компиляцией с использованием GCC.
: - / В любом случае оставлю свой ответ живым для справки.
Как комментарий: я немного погуглил о том, что вы ищете, но, похоже, нет надежного способа отключить это предупреждение при выполнении программы. Один предложил перестроить /usr/lib/libSystem.B.dylib
без каких-либо результатов или опыта, если это действительно работает, но я лично считаю, что это слишком экстремально и даже может быть вредно. - Не рекомендую эту технику.
Если вы действительно хотите создать программу-эксплойт, попробуйте перестроить gets()
с помощью функции, созданной по заказу, и назовите функцию немного иначе, например, например. gets_c()
. Это должно быть обходным путем, чтобы отключить это предупреждение в macOS.
Старый ответ (относительно самого GCC):
Во-первых, похоже, что вы используете компилятор, совместимый с C99 или C89 / C90, или компилируете с опцией std=c99
или _6 _ / _ 7_, потому что только компиляторы, соответствующие стандартам, предшествующим C11, предупреждают об устаревании gets()
.
ISO / IEC удалил функцию gets()
в C11. Если вы скомпилируете C11 или более новый совместимый со стандартом компилятор, вы получите ошибку о неявном объявлении gets()
при его использовании в коде вместо этого:
ошибка: неявное объявление функции 'gets'
; ты имел ввиду 'fgets'
? [-Werror=implicit-function-declaration
]
Если вы хотите подавить предупреждение при компиляции, используйте параметр -Wno-deprecated-declarations
при компиляции, чтобы отключить диагностику устаревших объявлений.
Из онлайн-документов GCC:
-Wno-устаревшие-декларации
Не предупреждать об использовании функций, переменных и типов, отмеченных как устаревшие с помощью атрибута deprecated. (см. Атрибуты функций, см. Атрибуты переменных, см. Атрибуты типа.)
Источник: https://gcc.gnu.org/onlinedocs/gcc-3.4.6/gcc/Warning-Options.html
Если вы хотите встроить подавление предупреждения в свой код, используйте подход, использованный в удаленном ответе Дэвида, реализующий подавление для -Wno-deprecated-declarations
с помощью #pragma
:
char str[256];
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
gets(str);
#pragma GCC diagnostic pop
person
RobertS supports Monica Cellio
schedule
28.05.2020
gets
? Вы можете написать свой собственный небезопасныйmygets
на основеfgets
(около 3-4 строк кода) или на основеfgetc
(~ 5-6 строк кода). - person Jabberwocky   schedule 28.05.2020gets()
. - person RobertS supports Monica Cellio   schedule 28.05.2020#pragma
не улучшает то, насколько легко можно обнаружить проблему. - person Marek R   schedule 28.05.2020