Как я могу убедиться, что vfprintf имеет правильное количество аргументов? - PullRequest
3 голосов
/ 10 сентября 2011

У меня есть функция с переменным аргументом в C, которая выглядит примерно так:

void log(const char * format, ...) {

  va_list args;
  va_start(args, format);
  vfprintf( stderr, format, args );
  va_end(args);
  exit(1);
}

Я смог закрыть приложение, позвонив так,

log("%s %d", 1);

потому что в функции отсутствовал аргумент. Есть ли способ определить, что аргумент отсутствует во время выполнения?

Ответы [ 3 ]

5 голосов
/ 10 сентября 2011

Нет, нет. Но когда вы компилируете свой код с помощью gcc, вы должны добавить опции -Wall -Wextra -Wformat -Os. Это включит много предупреждений, и когда вы аннотируете свою функцию с помощью __attribute__(__printf__, 2, 3) или чего-то подобного (я не помню точный синтаксис), должно появиться предупреждение для точно вашего случая.

См. http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html для точного синтаксиса. Это действительно __atttribute__((__format__(__printf__, 1, 2))).

2 голосов
/ 10 сентября 2011

Я не верю, что был бы какой-то стандартный механизм для определения этого во время выполнения.Параметры после спецификатора формата - это просто значения в стеке.Например, если спецификатор формата указывает, что следующим является 4-байтовое целое число, не было бы никакого способа узнать, были ли следующие 4 байта в стеке целыми числами или просто тем, что произошло в стеке от предыдущего вызова.

0 голосов
/ 10 сентября 2011

Нет, нет, C позволит вам так же выстрелить себе в ногу.

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