为什么调用exit函数会创建一个新的基本块

时间:2013-02-05 18:28:02

标签: c parsing compiler-construction clang

我的函数定义为:

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

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

然而,当我用exit(0)替换对rand()的调用时,它将它分成4个基本块。 维基百科(http://en.wikipedia.org/wiki/Basic_block)表示无法返回的函数可以在基本块的末尾。

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

2 个答案:

答案 0 :(得分:1)

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

<stdlib.h>的特定实现中可能还有一些内容使exit()作为一个不返回的函数,可能使用语言扩展或由_Noreturn关键字添加的sin(0.0)关键字2011 ISO C标准。

另一个示例:调用-O10.0或更高版本,编译为文字sin,因为编译器知道sin(0.0)函数。 (这意味着只有在您不优化的情况下,调用-lm的程序才需要与static相关联。)

这是完全允许的,因为定义与标准库函数同名的自己的(非exit)函数的程序具有未定义的行为;编译器不需要考虑调用sin或{{1}}除了标准为这些函数指定的内容之外的其他任何内容。

答案 1 :(得分:1)

clang是一只非常聪明的野兽。你能想到的事情让你感到惊讶。

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