2010-08-25 8 views
16

En mi copia de VS2010, stdlib.h contiene (líneas 353-355)abortar() no está __declspec (NoReturn) en VS2010

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

Me parece extraño que no hay noreturn anotación en abort(). ¿Alguien sabe una razón para esto? ¿Es un error?

EDIT: En VS2008, que es la misma, pero las líneas 371 a 373 de stdlib.h

La falta de la noreturn anotación está provocando error C4716.

Referencia adicional: C++0x proposal for standardization of the noreturn annotation, que dice que abort debe llevarlo.

EDITAR: Parece que un montón de discusión desapareció con una respuesta eliminada, pero la esencia está cubierta en Defect Report #048.

+0

buena pregunta! En la libc del mundo de Linux está marcado como noreturn. –

Respuesta

6

Creo que esto es definitivamente incorrecto porque independientemente de lo que exige el estándar, la implementación abort() incluida con Visual Studio nunca volverá de abortar. No se puede hacer nada en el controlador de señal para SIGABRT que evitará que se llame a _exit (3) al final de la implementación abort() de Visual Studio (estoy viendo el archivo abort.c, línea 137 en las fuentes enviadas con VS 2005).

Así que como __declspec (noreturn) es una implementación y dado que la implementación de abortar en Visual Studio nunca, nunca volverá normalmente, abort() debería etiquetarse con __declspec (noreturn).

Se deduce que su ausencia es un error.

creo que debe reportar esto como un error en https://connect.microsoft.com/VisualStudio/

+0

¿Qué parte de la norma crees que alguna vez permitiría que una implementación conforme volviera de 'abort()'? AFAICT 'SIGABRT' no se puede ignorar. POSIX menciona "si el manejador de señal nunca regresa", lo que sugiere que aborto podría ser cancelado por 'longjmp' (o el equivalente implementado con excepciones de C++) pero no por retorno. –

+0

No sé qué parte de la std haría o no y creo que no importa lo que dice la norma. La implementación abort() de MS nunca volverá. Por lo tanto, es un error de implementación que no está etiquetado como noreturn. –

Cuestiones relacionadas