Поради начина, по който работят променливите аргументи на C, компилаторът не може да проследи правилното им използване. Все още е (синтактично) законно да се предоставят по-малко или повече параметри, необходими на функцията, за да работи, въпреки че това обикновено завършва като недефинирано поведение, когато се гледа на стандарта.
Декларацията на printf
изглежда така:
int printf(const char*, ...);
Компилаторът вижда само ...
и знае, че може да има нула или повече допълнителни аргументи, които функцията може или не може да използва. Извиканата функция не знае колко аргумента са й предадени; в най-добрия случай може да предположи, че му е предадена цялата необходима информация и нищо повече.
Сравнете това с други езици, като C#:
void WriteLine(string format, params object[] arguments);
Тук методът знае точно колко допълнителни аргумента са предадени (извършвайки arguments.Length
).
В C променливите функции и особено printf
са честа причина за уязвимости в сигурността. Printf
завършва с четене на необработени байтове от стека, което може да изтече важни подробности за вашето приложение и неговата среда за сигурност.
Поради тази причина Clang и GCC поддържат специално разширение за валидиране на printf
формати. Ако използвате низ с невалиден формат, ще получите предупреждение (а не грешка).
code.c:4:11: warning: more '%' conversions than data arguments [-Wformat]
printf("%d\n");
~~^
person
zneak
schedule
28.01.2015