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

C 为什么调用退出函数会创建一个新的基本块,c,parsing,compiler-construction,clang,C,Parsing,Compiler Construction,Clang,我有一个函数定义为: int f_2() { rand(); return 10; } 叮当声把它分成3个基本块。这是可以理解的 但是,当我用exit(0)替换对rand()的调用时,它会将其分为4个基本块。 Wikipedia()说,无法返回的函数可以位于基本块的末尾 clang如何知道exit()函数不返回? 我正在用clang-c编译我的代码。clang是一个c编译器;允许利用语言标准对标准库函数的保证 在的特定实现中,也可能有某种东西使退出()成为一个不返回的函数,可能是使用语

我有一个函数定义为:

int f_2() {
  rand();
  return 10;
}
叮当声把它分成3个基本块。这是可以理解的

但是,当我用exit(0)替换对rand()的调用时,它会将其分为4个基本块。 Wikipedia()说,无法返回的函数可以位于基本块的末尾

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

clang
是一个c编译器;允许利用语言标准对标准库函数的保证

的特定实现中,也可能有某种东西使
退出()
成为一个不返回的函数,可能是使用语言扩展名或2011 ISO C标准添加的
\u Noreturn
关键字

另一个例子是:调用
sin(0.0)
,使用
-O1
或更高版本,编译成文本
0.0
,因为编译器知道
sin
函数。(这意味着调用
sin(0.0)
的程序需要链接到
-lm
,前提是您没有对其进行优化。)


这都是允许的,因为使用与标准库函数相同的名称定义自己的(非静态)函数的程序具有未定义的行为;编译器不必考虑调用<代码>退出<代码>或<代码> Sin < /C> >除了标准所指定的那些功能之外的任何事情。

<代码> CLAN<代码>是一个相当聪明的野兽。你会惊讶于它能解决的事情的数量


exit
功能是标准功能,已知不会返回。编译器利用了这个事实。

是的,这就是我想知道的。它是什么语言扩展,或者是否硬编码到某个代码中。不过我需要花点时间看看。如果你能找到导致这种情况的确切原因,那么你能更新你的答案吗?@iamrhitbanga这很容易。只需打开/usr/include/stdlib.h。您将发现类似于这个原型的东西
extern void exit(int uuu status)\uuuu THROW uu attribute_uuu((uu noreturn_u))。__属性__((_noreturn__))是一个gcc扩展,许多其他编译器也理解它。它也可能是编译器本质上知道一些标准函数是如何工作的。也就是说,使用rand()函数可以生成4个基本块。