我有一个函数定义为:
int f_2() {
rand();
return 10;
}
clang 将其分为 3 个基本块。这是可以理解的。
但是,当我用 exit(0) 替换对 rand() 的调用时,它会将其分成 4 个基本块。 维基百科 (http://en.wikipedia.org/wiki/Basic_block) 表示无法返回的函数可能位于基本块的末尾。
clang 如何知道 exit() 函数没有返回? 我正在使用 clang -c 编译我的代码。
clang
是一个C编译器。允许利用语言标准对标准库函数所做的保证。
在
<stdlib.h>
的特定实现中也可能有一些东西将 exit()
标记为不返回的函数,可能使用语言扩展或 2011 ISO C 标准添加的 _Noreturn
关键字。
另一个例子:使用
sin(0.0)
或更高级别的调用 -O1
会编译为文字 0.0
,因为编译器知道 sin
函数。 (这意味着调用 sin(0.0)
的程序只有在不优化的情况下才需要与 -lm
链接。)
这都是允许的,因为定义自己的(非
static
)函数与标准库函数同名的程序具有未定义的行为;编译器不需要考虑对 exit
或 sin
的调用执行除标准为这些函数指定的操作之外的任何操作的可能性。
clang
是一只非常聪明的野兽。你会对它能解决的事情之多感到惊讶。
exit
函数是标准函数,已知不会返回。编译器利用了这一事实。