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.
Я думаю, что это определенно неправильно, потому что вне зависимости от того, что предписано стандартом, реализация 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/