Как да деактивирам предупреждението за използване на остарели gets в GCC?

Изпълнявам CTF и в момента пиша проблем, който използва функцията gets на C. Разбирам, че функцията е остаряла и опасна и никога не бих я използвал при никакви други обстоятелства. За съжаление, gcc компилира моя код и когато стартирам двоичния файл, когато функцията gets бъде ударена, получавам приятелско съобщение за грешка:

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

Това обикновено би било страхотно, защото ви предупреждава, че gets не е безопасно, но за съжаление, в моя 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.

:-/ Както и да е, оставям отговора си жив за справка.

Само като коментар: Потърсих малко в Google за това, което търсите, но изглежда няма надежден начин да деактивирате това предупреждение при изпълнение на програмата. Един предложи възстановяване на /usr/lib/libSystem.B.dylib без никакъв резултат или опит, ако наистина работи, но аз лично смятам, че това е малко прекалено крайно и дори може да бъде вредно. - Не препоръчвам тази техника.

Ако наистина искате да създадете експлойт програма, опитайте се да възстановите gets() чрез създадена от костюма функция и наименувайте функцията малко по-различно, като f.e. gets_c(). Това трябва да е заобиколно решение за деактивиране на това предупреждение от macOS.


Стар отговор (по отношение на самия GCC):

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

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

грешка: неявна декларация на функция 'gets'; имаш предвид 'fgets'? [-Werror=implicit-function-declaration]


Ако искате да потиснете предупреждението при компилиране, използвайте опцията -Wno-deprecated-declarations при компилиране, за да деактивирате диагностиката за остарели декларации.

От онлайн документите на GCC:

-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
person RobertS supports Monica Cellio    schedule 28.05.2020
comment
Добър отговор, редактиран, тъй като отговорът ми вече не е полезен - person David Ranieri; 28.05.2020