Как осуществляется проверка типа в printf? - PullRequest
1 голос
/ 29 сентября 2019

Я пишу компилятор и хочу реализовать проверку типа в printf:

printf("%f", i);



warning: format specifies type 'double' but the argument has type 'int' [-Wformat]   
  printf("%f", 1);
           ~~   ^~
           %d

Как видите, gcc знает, что означает% f, и пытается предупредить меня онесоответствие типов.

Так, как я могу это реализовать?

PS Есть ли шанс, что нет никаких загадок, просто специальное правило gcc write для printf?

1 Ответ

2 голосов
/ 29 сентября 2019

Это комбинация двух специальных правил, описанных в документации -Wformat.

Функция printf встроена в , что позволяет GCCи для оптимизации, и для предупреждения о неправильном использовании.Что касается конкретного случая printf, в документации есть примечание :

Кроме того, когда функция распознается как встроенная функция, GCC может использовать информациюоб этой функции, чтобы предупредить о проблемах с вызовами этой функции или сгенерировать более эффективный код, даже если полученный код все еще содержит вызовы этой функции.Например, предупреждения выдаются с -Wformat для неправильных вызовов на printf, когда встроен printf и известно, что strlen не изменяет глобальную память.

Кроме того, вы можетеобъявляйте ваши собственные функции как printf-подобные для целей предупреждения с атрибутом format .

__attribute__((__format__(__printf__, 2, 3))) /*printf-like function, the format string is parameter 2, the first element is parameter 3*/
int myprintf(int stuff, const char *format, ...);

С помощью встроенной функции GCC пытается заменить вызов функции чем-то болееэффективный.Для printf это обычно означает, что когда аргумент формата является строковым литералом, GCC заменяет его серией вызовов для печати отдельных элементов.Например, он может скомпилировать printf("%d %s\n", x, s);, как если бы программа содержала __some_internal_function_to_print_a_dcimal_integer__(x); putc(' '); puts(s);.Пока компилятор выполняет эту оптимизацию, он заметит любое несоответствие между строкой формата и типами аргументов и предупредит соответственно.Если функция не встроена, но имеет атрибут format, вы просто получите предупреждения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...