Защо C толерира декларации на липсващи функции?

Днес се натъкнахме на необичаен феномен, колега извикваше нормално работеща функция в кода си, която задействаше segfault в libc (gethostbyname). Озадачаващото беше, че същата функция работи без проблеми в други изходни файлове в същото време на изпълнение. Учудващо, segfault изчезна, когато беше използван valgrind, всъщност той работи перфектно с valgrind, без докладвани грешки.

След много жертви, за да успокоим боговете на компилатора, в крайна сметка осъзнахме, че заглавният файл, деклариращ функцията, липсва от изходния файл, който извика функцията. След като добавихме това, всичко заработи нормално.

Защо gcc/ld не генерира грешка (или дори предупреждение), показваща, че функцията не е разпозната?, защо работи с valgrind?

Благодаря.


person Gearoid Murphy    schedule 27.07.2012    source източник
comment
PS: C не позволява липсващи функции (неразрешените символи трябва да бъдат диагностицирани). Позволих си да променя заглавието на липсващи функции декларации.   -  person Jens    schedule 27.07.2012


Отговори (1)


Защото не сте използвали правилните опции за предупреждение, като -Wall -Wmissing-prototypes -Wstrict-prototypes. По подразбиране gcc е доста либерален в това, което приема. Езикът C (поне C89) има концепцията за имплицитни декларации на функции, където функция без прототип има върнат тип и списък с аргументи, получени от първото й използване в извикване на функция, и липсата на това, връща int и приема неопределен, но фиксиран брой аргументи (т.е. не може да бъде vararg функция).

person Jens    schedule 27.07.2012
comment
Трудно да се каже. Беше ли липсващият прототип на стандартна C функция, може би malloc()? Какво беше името на функцията? - person Jens; 27.07.2012
comment
Това беше проста C функция, локална за проекта - person Gearoid Murphy; 27.07.2012
comment
Тогава ме бие; Имам само бегло разбиране за valgrind и малко познания са опасно нещо... така че по-добре да не спекулирам. Основно правило: вдигнете нивото на предупреждение колкото можете повече. - person Jens; 27.07.2012
comment
Предложете -Wall и -Werror. Тези двамата извънредно ще ви направят много по-добър програмист. - person sherrellbc; 24.01.2018
comment
@sherrellbc Съгласен съм, но имайте предвид, че -Wall не включва предупредителните флагове, споменати в този отговор. - person Zitrax; 31.01.2019