Подтвердить что ты не робот

Abort() не __declspec (noreturn) в VS2010

В моей копии 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. Кто-нибудь знает причину этого? Это ошибка?

EDIT: в VS2008 это то же самое, но строки 371-373 из stdlib.h

Отсутствие аннотации noreturn вызывает ошибку C4716.

Дальнейшая ссылка: Предложение С++ 0x для стандартизации аннотации noreturn, в котором говорится, что abort должен нести его.

EDIT: Похоже, что куча обсуждений исчезла с удаленным ответом, но суть его описана в Отчет об ошибках # 048.

4b9b3361

Ответ 1

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

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

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

Я думаю, вы должны сообщить об этом как об ошибке в https://connect.microsoft.com/VisualStudio/