C++ 在VS2010中,abort()不是declspec(noreturn)

C++ 在VS2010中,abort()不是declspec(noreturn),c++,c,visual-studio-2010,abort,C++,C,Visual Studio 2010,Abort,在我的VS2010副本中,stdlib.h包含(第353-355行) 我觉得奇怪的是,abort()上没有noreturn注释。有人知道这样做的原因吗?是虫子吗 编辑:在VS2008中是相同的,但是stdlib.h的第371-373行 正在触发缺少noreturn注释 进一步参考:,它说中止应该携带它 编辑:看起来一大堆讨论都消失了,答案被删除了,但其中的要点已包含在内。我认为这肯定是错误的,因为无论std要求什么,Visual Studio附带的abort()实现都不会从abort返回。您不能

在我的VS2010副本中,stdlib.h包含(第353-355行)

我觉得奇怪的是,
abort()
上没有
noreturn
注释。有人知道这样做的原因吗?是虫子吗

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

正在触发缺少
noreturn
注释

进一步参考:,它说
中止
应该携带它


编辑:看起来一大堆讨论都消失了,答案被删除了,但其中的要点已包含在内。

我认为这肯定是错误的,因为无论std要求什么,Visual Studio附带的abort()实现都不会从abort返回。您不能在SIGABRT的信号处理程序中执行任何操作,以防止在Visual Studio的abort()实现结束时调用_exit(3)(我正在查看VS 2005附带的源代码中的文件abort.c,第137行)

因此,由于uu declspec(noreturn)是一个实现的东西,并且由于在Visual Studio中实现abort永远不会正常返回,abort()应该用u declspec(noreturn)标记

因此,它的缺失是一个bug


我认为你应该在

上报告这是一个错误,这是一个好问题!在linux世界的libc中,它被标记为noreturn。您认为标准的哪一部分会允许一致性实现从
abort()
返回?不能忽略AFAICT
SIGABRT
。POSIX提到了“如果信号处理程序永远不返回”,这表明中止可以被取消代码< >龙JMP < /代码>(或等效的实施与C++异常),但不通过返回。我不知道什么部分的性病会或不会,我认为这并不重要的STD说。MS的abort()实现将永远不会返回。因此,它没有标记为noreturn是一个实现缺陷。
_CRTIMP __declspec(noreturn) void __cdecl exit(_In_ int _Code);
_CRTIMP __declspec(noreturn) void __cdecl _exit(_In_ int _Code);
_CRTIMP void __cdecl abort(void);