VS2010 中的 abort() 不是 __declspec(noreturn)
在我的 VS2010 副本中,stdlib.h 包含(第 353-355 行),
_CRTIMP __declspec(noreturn) void __cdecl exit(_In_ int _Code);
_CRTIMP __declspec(noreturn) void __cdecl _exit(_In_ int _Code);
_CRTIMP void __cdecl abort(void);
我觉得很奇怪,abort()
上没有 noreturn
注释。有谁知道其中的原因吗?这是一个错误吗?
编辑:在 VS2008 中,它是相同的,但 stdlib.h 的第 371-373 行
缺少 noreturn
注释正在触发 错误 C4716。
进一步参考:C++0x 标准化提案 < code>noreturn 注解,表示 abort
应该携带它。
编辑:看起来一堆讨论随着删除的答案而消失,但其要点包含在 缺陷报告#048。
In my copy of VS2010, stdlib.h contains (lines 353-355)
_CRTIMP __declspec(noreturn) void __cdecl exit(_In_ int _Code);
_CRTIMP __declspec(noreturn) void __cdecl _exit(_In_ int _Code);
_CRTIMP void __cdecl abort(void);
I find it strange that there's no noreturn
annotation on abort()
. Does anyone know a reason for this? Is it a bug?
EDIT: In VS2008, it's the same, but lines 371-373 of stdlib.h
The lack of the noreturn
annotation is triggering error C4716.
Further reference: C++0x proposal for standardization of the noreturn
annotation, which says that abort
should carry it.
EDIT: Looks like a bunch of discussion disappeared with a deleted answer, but the gist of it is covered in Defect Report #048.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我认为这绝对是错误的,因为无论 std 有何要求,Visual Studio 附带的 abort() 实现都永远不会从中止中返回。您不能在 SIGABRT 的信号处理程序中执行任何操作来阻止在 Visual Studio 的 abort() 实现结束时调用 _exit(3) (我正在查看文件 abort.c,随带的源代码中的第 137 行)对比 2005 年)。
因此,由于 __declspec(noreturn) 是一个实现,并且 Visual Studio 中 abort 的实现永远不会正常返回,因此 abort() 应该用 __declspec(noreturn) 标记。
由此可见,它的缺失是一个错误。
我认为您应该将此问题报告为 https://connect.microsoft.com/VisualStudio/
I think this is definitely wrong because regardless of what the std mandates, the abort() implementation shipped with Visual Studio will never return from abort. You cannot do anything in the signal handler for SIGABRT that will prevent _exit(3) being called at the end of the abort() implementation of Visual Studio (I'm looking at the file abort.c, line 137 in the sources shipped with VS 2005).
So since __declspec(noreturn) is an implementation thing and since the implemenation of abort in Visual Studio will never, ever return normally, abort() should be tagged with __declspec(noreturn).
It follows that it's absence is a bug.
I think you should report this as a bug at https://connect.microsoft.com/VisualStudio/