在VS2010中,abort()不是__declspec(noreturn)

时间:2010-08-25 19:46:47

标签: c++ c visual-studio-2010 abort

在我的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);

我觉得奇怪的是noreturn上没有abort()注释。有谁知道这个的原因?这是一个错误吗?

编辑:在VS2008中,它是相同的,但是stdlib.h的第371-373行

缺少noreturn注释会触发error C4716

进一步参考:C++0x proposal for standardization of the noreturn annotation,其中abort应该随身携带。

编辑:看起来一堆讨论因删除的答案而消失,但其中的要点包含在Defect Report #048中。

1 个答案:

答案 0 :(得分:6)

我认为这绝对是错误的,因为无论std强制执行什么,Visual Studio附带的abort()实现都不会从abort返回。你不能在SIGABRT的信号处理程序中做任何事情,这会阻止在Visual Studio的abort()实现结束时调用_exit(3)(我正在查看文件中的abort.c,第137行) VS 2005)。

因为__declspec(noreturn)是一个实现的东西,因为在Visual Studio中实现abort永远不会正常返回,所以abort()应该用__declspec(noreturn)标记。

因此,缺席是一个错误。

我认为您应该在https://connect.microsoft.com/VisualStudio/

报告此错误