如何确保vfprintf具有适当数量的参数?

时间:2011-09-09 21:52:32

标签: c

我在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 个答案:

答案 0 :(得分:5)

不,没有。但是当您使用gcc编译代码时,您应该添加选项-Wall -Wextra -Wformat -Os。这将启用大量警告,当您使用__attribute__(__printf__, 2, 3)或类似内容(我不记得确切的语法)注释您的函数时,应出现针对您的情况的警告。

有关确切语法,请参阅http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html。这真的是__atttribute__((__format__(__printf__, 1, 2)))

答案 1 :(得分:2)

我不相信在运行时会有任何标准机制来确定。格式说明符后面的参数只是堆栈上的值。例如,如果格式说明符指示接下来是4字节整数,则无法知道堆栈中的下4个字节是否是整数,或者只是前一次调用中堆栈上发生的任何事件。

答案 2 :(得分:0)

没有,没有,C会允许你像这样射击自己。

相关问题