abort () не является __declspec (noreturn) в VS2010 - PullRequest
16 голосов
/ 25 августа 2010

В моей копии 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 это то же самое, но строки 371-373 stdlib.h

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

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

EDITПохоже, что дискуссия исчезла с удаленным ответом, но суть этого раскрыта в Отчете о дефектах # 048 .

1 Ответ

6 голосов
/ 27 августа 2010

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

Из этого следует, что его отсутствие - это ошибка.

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

...