这个看起来无辜的程序是否会调用未定义的行为:
int main(void) {
printf("%d\n", 1);
return 0;
}
是的,调用printf()
没有适当的原型(来自标准头<stdio.h>
或来自正确编写的声明)调用未定义的行为。
正如 C 标准中所述:
6.5.2.2 函数调用
- 如果表示被调用函数的表达式具有不包含原型的类型,则对每个参数以及具有类型的参数执行整数提升
float
被提升为double
。这些称为默认参数促销。如果参数的数量不等于参数的数量,则行为未定义。如果函数是使用包含原型的类型定义的,并且原型以省略号 (, ...
) 或者提升后参数的类型与参数的类型不兼容,行为未定义。
用更务实的话说,在没有原型的情况下printf
,编译器生成调用序列,就好像printf
被定义为int printf(const char *, int)
这可能与实际实施有很大不同且不相容printf
在标准库中,定义为int printf(const char restrict *format, ...)
.
古代 ABI 足够规则,不会造成问题,但现代(例如 64 位)ABI 使用更高效的调用序列,这使得上述代码肯定不正确。
因此,这个著名的经典 C 程序也可能会失败,如果没有#include <stdio.h>
或者至少有一个合适的原型printf
:
int main() {
printf("Hello world\n"); // undefined behavior
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)