0

我有一个函数定义为:

int f_2() {
  rand();
  return 10;
}

clang 将其分成 3 个基本块。这是可以理解的。

但是,当我用 exit(0) 替换对 rand() 的调用时,它会将其分成 4 个基本块。维基百科 ( http://en.wikipedia.org/wiki/Basic_block ) 说不能返回的函数可以在基本块的末尾。

clang 怎么知道 exit() 函数没有返回?我正在用 clang -c 编译我的代码。

4

2 回答 2

1

clang是一个 C 编译器;允许利用语言标准为标准库函数做出的保证。

<stdlib.h>在特定实现中也可能有一些东西exit()作为不返回的函数,可能使用语言扩展或_Noreturn2011 ISO C 标准添加的关键字。

另一个例子:调用sin(0.0), with-O1或更高,编译为文字0.0,因为编译器知道sin函数。(这意味着调用的程序只有在你不优化的情况下才sin(0.0)需要链接。)-lm

这都是允许的,因为定义自己的(非static)函数与标准库函数同名的程序具有未定义的行为;编译器不需要考虑调用exitsin执行除标准为这些函数指定的之外的任何操作的可能性。

于 2013-02-05T18:29:59.390 回答
1

clang是一只非常聪明的野兽。你会惊讶于它可以计算出的东西的数量。

exit函数是标准的,并且已知不会返回。编译器利用了这一事实。

于 2013-02-05T18:30:40.343 回答