Как отключить предупреждение об использовании устаревших методов в GCC?

Я использую CTF, и в настоящее время я пишу проблему, которая использует функцию gets C. Я понимаю, что эта функция устарела и опасна, и я бы никогда не использовал ее ни при каких других обстоятельствах. К сожалению, gcc компилирует мой код, и когда я запускаю двоичный файл при срабатывании функции gets, я получаю понятное сообщение об ошибке:

warning: this program uses gets(), which is unsafe.

Обычно это было бы здорово, потому что оно предупреждает вас о том, что это небезопасно, но, к сожалению, в моем CTF я думаю, что это сообщение об ошибке делает проблему слишком простой. Вы знаете, как бы я отключил это предупреждение? Спасибо!

$ gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 11.0.3 (clang-1103.0.32.62)
Target: x86_64-apple-darwin19.4.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

person nywillb    schedule 28.05.2020    source источник
comment
Похоже, вы на самом деле используете clang, а не gcc.   -  person dbush    schedule 28.05.2020
comment
Простите за незнание, но что за CTF?   -  person Jonathan Leffler    schedule 28.05.2020
comment
@JonathanLeffler - я думаю, что это разновидность организованного соревнования по взлому варгеймов: ctftime.org/ctf-wtf   -  person selbie    schedule 28.05.2020
comment
Есть ли что-нибудь, что мешает вам не использовать gets? Вы можете написать свой собственный небезопасный mygets на основе fgets (около 3-4 строк кода) или на основе fgetc (~ 5-6 строк кода).   -  person Jabberwocky    schedule 28.05.2020
comment
Я только что понял, что ваше предупреждение не имеет ничего общего с самим GCC - поэтому заголовок вопроса кажется неуместным. Вы получили предупреждение от macOS о запуске программы, использующей gets().   -  person RobertS supports Monica Cellio    schedule 28.05.2020
comment
@Jabberwocky опубликуйте это как ответ, так как это лучшее решение для таких соревнований, как CFT. Текущий ответ с #pragma не улучшает то, насколько легко можно обнаружить проблему.   -  person Marek R    schedule 28.05.2020
comment
@MarekR ответ ниже уже охватывает это   -  person Jabberwocky    schedule 28.05.2020


Ответы (1)


Примечание: я только что понял, что заголовок вашего вопроса кажется неуместным - вы получили предупреждение от 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
comment
Хороший ответ, отредактированный, так как мой ответ больше не полезен - person David Ranieri; 28.05.2020