【发布时间】:2010-08-26 19:56:10
【问题描述】:
任何工作超过一周的 C 程序员都遇到过由于使用比实际参数更多的格式说明符调用 printf 而导致的崩溃,例如:
printf("Gonna %s and %s, %s!", "crash", "burn");
但是,当您将 太多 参数传递给 printf 时,是否会发生类似的坏事?
printf("Gonna %s and %s!", "crash", "burn", "dude");
我对 x86/x64 汇编的了解使我相信这是无害的,尽管我不相信我没有遗漏一些边缘条件,而且我不知道其他架构。这种情况是否可以保证是无害的,或者这里是否也存在潜在的崩溃陷阱?
【问题讨论】:
-
不是你的问题的答案,堆垛机是正确的,但对于崩溃。
gcc应该对此给出很好的警告,所以真的没有理由忽略那个;-) -
GCC 怎么会给出警告呢?考虑到格式字符串不一定是常量字符串。可以是任何
char * -
GCC 可以在编译时知道格式字符串时给出很好的警告。由于这代表了
printf和朋友的大量合理用例,因此这些警告很有价值,应该引起注意。 -
gcc 也可以在格式字符串不是字符串文字时发出警告,如果我没记错的话。这是为了捕捉像
printf(mystring);这样的愚蠢东西。