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

标签 c parsing compiler-construction clang

我有一个函数定义为:

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

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

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

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

最佳答案

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

<stdlib.h>的具体实现中也可能存在一些问题。这使得exit()作为不返回的函数,可能使用语言扩展或 _Noreturn 2011 ISO C 标准添加的关键字。

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

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

关于c - 为什么调用 exit 函数会创建一个新的基本 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14714325/

相关文章:

c - 不会打印字符串。字符数组

c# - C# 中的 Sql Parser 用于语法检查 Oracle 语句

parsing - 括号如何与自定义数据类型一起使用?

c# - Mac OS X Mono ASP.NET和C#编译过程

c - c中的 union 初始化

c++ -\t 考虑了多少个空格

c++ - 如何判断 double float 是否可以安全地存储为单精度 float ?

c# 无法解析 xml,收到错误 463

c# - 为什么不能通过实例名称访问静态成员?

c++ - 是否可以为 exe 重新生成符号?