2010-08-25 5 views
16

Dans ma copie de VS2010, stdlib.h contient (lignes 353-355)abort() n'est pas __declspec (noreturn) dans VS2010

_CRTIMP __declspec(noreturn) void __cdecl exit(_In_ int _Code); 
_CRTIMP __declspec(noreturn) void __cdecl _exit(_In_ int _Code); 
_CRTIMP void __cdecl abort(void); 

Je trouve étrange qu'il n'y a pas d'annotation noreturn sur abort(). Est-ce que quelqu'un sait une raison pour cela? Est-ce un bug?

EDIT: En VS2008, c'est la même, mais les lignes 371-373 de stdlib.h

L'absence de l'annotation noreturn déclenche error C4716. Référence: C++0x proposal for standardization of the noreturn annotation, qui dit que abort devrait le porter.

EDIT: On dirait qu'un tas de discussions a disparu avec une réponse supprimée, mais l'essentiel est couvert par Defect Report #048.

+0

bonne question! Dans la libc du monde Linux, il est marqué comme noreturn. –

Répondre

6

Je pense que cela est définitivement faux, car indépendamment de ce que les mandats std, l'implémentation abort() livré avec Visual Studio ne reviendra jamais d'abandonner. Vous ne pouvez rien faire dans le gestionnaire de signal pour SIGABRT qui empêchera _exit (3) d'être appelé à la fin de l'implémentation de Visual Studio par abort() (je regarde le fichier abort.c, ligne 137 dans les sources livrées avec VS 2005). Donc, puisque __declspec (noreturn) est une implémentation et que l'implémentation d'avort dans Visual Studio ne retournera jamais, normalement, abort() devrait être taguée avec __declspec (noreturn).

Il s'ensuit que son absence est un bug.

Je pense que vous devez le signaler comme un bug à https://connect.microsoft.com/VisualStudio/

+0

Selon vous, quelle partie de la norme permettrait à une implémentation conforme de revenir de 'abort()'? AFAICT 'SIGABRT' ne peut pas être ignoré. POSIX fait une mention de "si le gestionnaire de signal ne retourne jamais" ce qui suggère que l'annulation peut être annulée par 'longjmp' (ou l'équivalent implémenté avec des exceptions C++) mais pas via return. –

+0

Je ne sais pas quelle partie de la norme serait ou ne le serait pas et je pense que peu importe ce que dit la norme. L'implémentation abort() de MS ne retournera jamais. Par conséquent, il s'agit d'un bug d'implémentation qui n'est pas marqué noreturn. –