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