编译器如何检测并警告printf函数传入过多参数?
编译器如何检测printf()传入过多参数?
普通可变参数函数确实没法让编译器知晓实际传入的参数数量,但printf()这类格式化函数是编译器的特殊关照对象,靠以下几步实现参数数量检查:
- 编译器会把标准库中的
printf、scanf等格式化函数标记为「需格式检查的函数」,启用专门的静态分析规则。 - 编译时,编译器会解析
printf的第一个参数(格式字符串),逐个识别里面的占位符(比如%d、%s),统计出需要的参数总数。如果格式字符串里没有任何占位符,那预期参数数量就是0。 - 接着编译器会对比「预期参数数量」和「实际传入的参数个数(格式字符串之外的参数)」,如果实际数量超出预期,就会抛出
-Wformat-extra-args警告(也就是示例里看到的警告)。
示例代码
#include <stdio.h> int main() { printf("Hello World", 2); return 0; }
编译输出
main.c: In function ‘main’: main.c:6:12: warning: too many arguments for format [-Wformat-extra-args] 6 | printf("Hello World", 2,3,4); | ^~~~~~~~~~~~~ Hello World
而你自己用va_list实现的普通可变参数函数,因为没有内置的格式字符串解析逻辑,编译器没法知道你预期的参数数量,自然也就做不到这类检查。
内容的提问来源于stack exchange,提问作者Aditya Kurrodu
相关产品推荐
相关产品推荐

