abort() is not __declspec(noreturn) in VS2010

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.

16
задан Ben Voigt 25 August 2010 в 20:26
поделиться

1 ответ

Я думаю, что это определенно неправильно, потому что вне зависимости от того, что предписано стандартом, реализация abort(), поставляемая с Visual Studio, никогда не вернется из прерывания. Вы не можете сделать ничего в обработчике сигнала для SIGABRT, что предотвратит вызов _exit(3) в конце реализации abort() Visual Studio (я смотрю файл abort.c, строка 137 в исходниках, поставляемых с ВС 2005).

Таким образом, поскольку __declspec(noreturn) является реализацией и поскольку реализация abort в Visual Studio никогда, никогда не завершится нормально, abort() следует пометить тегом __declspec(noreturn).

Отсюда следует, что его отсутствие является ошибкой.

Думаю, вам следует сообщить об этом как об ошибке по адресу https://connect.microsoft.com/VisualStudio/

6
ответ дан 30 November 2019 в 23:27
поделиться