VS2010 中的 abort() 不是 __declspec(noreturn)

发布于 2024-09-16 10:33:17 字数 817 浏览 6 评论 0原文

在我的 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

爱的故事 2024-09-23 10:33:17

我认为这绝对是错误的,因为无论 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/

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文