在FreeBSD/bin /和/ usr/bin中返回vs退出

oxn*_*xnz 5 c freebsd return exit

我注意到FreeBSD代码/bin并且/usr/bin有一些修复使用exit而不是return,这是什么意思?

我所有的想法都是return声明可能导致vfork(2)损坏堆栈帧,这是唯一的原因吗?如果这是真的,那么为什么只是在命令部分/bin/usr/bin得到修复,不是所有的人?

aut*_*tic 1

根据5.1.2.2.3p1

如果 main 函数的返回类型是与 int 兼容的类型,则初始调用 main 函数的返回相当于以 main 函数的返回值作为参数调用 exit 函数

这排除了你破坏堆栈框架理论的可能性;return 0;在功能上与一致的 C 实现相同exit(0);(至少对于非递归main入口点)。

我认为这种变化仅仅是风格上的,或者可能是出于无知。另一种可能是作者有转变main成递归函数的愿望(或者main已经转变成递归函数了;idk,我只是做了一个快速的 grep ,它看起来并没有立即递归)。最后,作为最后一个严峻的选择,也许 FreeBSD 使用的 C 实现是不合格的(我当然希望不是!)...

编辑:通过阅读这个答案,我突然想到这可能是编译器错误的解决方法,但可惜我检查了源代码的使用情况atexit,并且找不到任何理由进一步追求这一推理。