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