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

问题描述 投票:0回答:2

我有一个函数定义为:

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

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

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

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

c parsing compiler-construction clang
2个回答
2
投票

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

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

另一个例子:使用

sin(0.0)
或更高级别的调用
-O1
会编译为文字
0.0
,因为编译器知道
sin
函数。 (这意味着调用
sin(0.0)
的程序只有在不优化的情况下才需要与
-lm
链接。)

这都是允许的,因为定义自己的(非

static
)函数与标准库函数同名的程序具有未定义的行为;编译器不需要考虑对
exit
sin
的调用执行除标准为这些函数指定的操作之外的任何操作的可能性。


2
投票

clang
是一只非常聪明的野兽。你会对它能解决的事情之多感到惊讶。

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

© www.soinside.com 2019 - 2024. All rights reserved.