Как отключить предупреждение об использовании устаревших методов в G CC? - PullRequest
0 голосов
/ 28 мая 2020

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

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

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

$ 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

1 Ответ

3 голосов
/ 28 мая 2020

Примечание: я только что понял, что заголовок вашего вопроса кажется неуместным - вы получили предупреждение от macOS о выполнении программы, в которой используется gets(). Это не имеет ничего общего с компиляцией с использованием G CC.

: - / В любом случае, я оставляю свой ответ живым для справки.

Так же, как комментарий: я немного погуглил то, что вы ищете, но, похоже, нет надежного способа отключить это предупреждение при выполнении программы. Один предложил перестроить /usr/lib/libSystem.B.dylib без каких-либо результатов или опыта, если это действительно работает, но я лично считаю, что это слишком экстремально и даже может быть вредно. - Я не рекомендую эту технику.

Если вы действительно хотите создать программу-эксплойт, попробуйте пересобрать gets() с помощью функции, созданной с помощью функции costum, и назовите функцию немного иначе, например, fe gets_c(). Это должно быть обходным путем, чтобы отключить это предупреждение в macOS.

Старый ответ (относительно самого G CC):

Во-первых, похоже, вы используете компилятор, совместимый с C99 или C89 / C90, или компилируете его с помощью std=c99 или std=c89 / Параметр std=c90, потому что только компиляторы, соответствующие стандартам, предшествующим C11, предупреждают об устаревании gets().

ISO / IEC удалена функция gets() в C11. Если вы компилируете с помощью C11 или более нового компилятора, совместимого со стандартами, вы получите ошибку о неявном объявлении gets() при использовании его в коде:

" error: неявное объявление функции 'gets'; вы имели в виду 'fgets'? [-Werror=implicit-function-declaration]"

Если вы хотите подавить предупреждение при компиляции, используйте параметр -Wno-deprecated-declarations при компиляции, чтобы отключить диагностику c для устаревших объявлений.

Из онлайн-документации G CC:

-Wno-deprecated-декларации

Не предупреждать об использовании функций, переменных и типов, помеченных как устаревшие с помощью атрибута 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
...