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