2010-08-25 20 views
16

Nella mia copia di VS2010, stdlib.h contiene (linee 353-355)abort() non è __declspec (noreturn) in VS2010

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

Trovo strano che non ci sia noreturn annotazione abort(). Qualcuno sa una ragione per questo? E 'un errore?

EDIT: In VS2008, è lo stesso, ma le linee di 371-373 stdlib.h

La mancanza del noreturn annotazione è innescare error C4716.

Ulteriori riferimenti: C++0x proposal for standardization of the noreturn annotation, che dice che abort dovrebbe portarlo.

MODIFICA: Sembra che un gruppo di discussioni sia scomparso con una risposta cancellata, ma il suo significato è trattato in Defect Report #048.

+0

bella domanda! Nella libc del mondo linux è contrassegnato come noreturn. –

risposta

6

Penso che questo sia decisamente sbagliato perché, indipendentemente da ciò che richiede lo std, l'implementazione abort() fornita con Visual Studio non tornerà mai dall'aborto. Non si può fare nulla nel gestore del segnale per SIGABRT che impedisca che _exit (3) venga chiamato alla fine dell'implementazione abort() di Visual Studio (sto guardando il file abort.c, riga 137 nei sorgenti forniti con VS 2005).

Quindi poiché __declspec (noreturn) è una cosa di implementazione e poiché l'implementazione di abort in Visual Studio non verrà mai restituita mai normalmente, abort() dovrebbe essere taggato con __declspec (noreturn).

Ne consegue che l'assenza è un bug.

Credo che si dovrebbe segnalare questo come un bug a https://connect.microsoft.com/VisualStudio/

+0

Quale parte dello standard pensi possa mai consentire a un'implementazione conforme di ritornare da 'abort()'? AFAICT 'SIGABRT' non può essere ignorato. POSIX fa menzione di "se il gestore di segnali non ritorna mai" il che suggerisce che l'abort potrebbe essere cancellato da 'longjmp' (o l'equivalente implementato con eccezioni C++) ma non tramite return. –

+0

Non so quale parte dello std sarebbe o no e penso che non importa ciò che dice lo std. L'implementazione abort() della SM non tornerà mai più. Pertanto è un bug di implementazione che non è codificato noreturn. –

Problemi correlati