我在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);
因为函数缺少一个参数。有没有办法确定运行时缺少参数?
答案 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会允许你像这样射击自己。