Cuando falla una llamada assert()
, ¿cuál es el código de salida utilizado y dónde está documentado?Cuando assert() falla, ¿cuál es el código de salida del programa?
Respuesta
Los c99 norma indica que assert
llamadas abort
y los abort
estados cosas lo siguiente acerca del código de retorno:
Una forma definida por la implementación del estado de terminación sin éxito se devuelve al entorno de acogida a través de la función aumento de llamadas (SIGABRT).
Está documentado en la sección 7.2.1.1 (afirmar) y 7.20.4.1 (abortar) de la norma c99 here.
Muchos sistemas UNIX devolverán 128 más el número de señal (SIGABRT es la señal número 6) por lo que puede obtener 134. Lo que obtenga, debe documentarse mediante la implementación C.
Por ejemplo, ver here para gcc. Aunque no dice nada sobre lo que se devuelve al entorno de llamadas. De las secciones específicas here:
La biblioteca y el sistema operativo (u otro entorno cuando se compila para un entorno autónomo) seleccionan algunas opciones; consulte su documentación para más detalles.
Y here:
El comportamiento de la mayoría de estos puntos dependen de la implementación de la librería C, y no se definen por sí mismo GCC.
Así es el glibc doco here en la terminación del programa (específicamente el bit de estado de salida). Menciona convenciones pero no reglas firmes.
Es específico de la implementación. Usted puede hacer esto:
int main()
{
assert(0);
}
luego ejecutarlo:
> ./a.out
> echo $?
1 (<- or whatever)
Esto, al menos, te dirá qué esperar para su configuración. Estoy obteniendo 134 en un par de cajas linux con gcc y g ++.
Siempre debe respaldar sus respuestas con una referencia específica al estándar. – wilhelmtell
Los compiladores no siempre siguen el estándar de la T. (Estoy mirando a Microsoft) Si bien es bueno saber lo que dice la norma, también es igual de bueno saber lo que realmente hacen los compiladores. Lo que deberían hacer no es siempre lo que realmente hacen. Eso y el estándar no es realmente gratis. –
Estaba trabajando con colas de mensajes posix Tengo el mismo error mq_open falló con errono 38 (ENOSYS).
El trabajo consiste en reconstruir el kenel con POSIX MESSGE QUEUE habilitado en la configuración del kernel.
Esto construirá el núcleo con soporte de cola de mensajes POSIX y ha funcionado para mí.
Gracias
Creo que quisiste poner esta respuesta en otra pregunta. –
No puedo encontrar la especificación real de ella (POSIX es un poco difícil de búsqueda), pero he encontrado una referencia.
Una aserción arrojada da como resultado un estado de salida que es igual a lo que EXIT_FAILURE
se expande para ser (reference).Dado que se trata de Linux, también se trata de POSIX, que define aún más el comportamiento de c99.
- 1. ¿Cómo ejecutar el código antes de la salida del programa?
- 2. ¿Cuál es la causa del código de salida JVM 1073807364?
- 3. vacío "liberar" ASSERT macro bloquea el programa?
- 4. La salida del programa C es confusa
- 5. obtener el código de salida para el programa python
- 6. El descifrado de OpenSSL falla pero el código de error es 0
- 7. ¿Por qué la salida de mi programa de horquilla es diferente cuando canalizo su salida?
- 8. ¿Cuál es el equivalente del programa de desvinculación en Windows?
- 9. cuando es aceptable dar salida al código HTML de Javascript?
- 10. Cuál es la estrategia si falla la aserción
- 11. Obtener el estado de retorno Y la salida del programa
- 12. ¿Por qué mi programa no falla cuando escribo después del final de una matriz?
- 13. Cómo depurar un programa cuando falla sin excepción?
- 14. ¿Estoy mal entendiendo el uso de assert()?
- 15. Imprimir flujo de código fuente cuando se ejecuta el programa
- 16. ¿Cuál es el estado de registro predeterminado cuando se inicia el programa (asm, linux)?
- 17. ¿Debería ser "Arrange-Assert-Act-Assert"?
- 18. ¿Cuál es el uso correcto de realloc() cuando falla y devuelve NULL?
- 19. ASSERT vs. ATLASSERT vs. assert
- 20. Cómo sé a qué dirección ilegal accede el programa cuando ocurre una falla de segmentación
- 21. ¿Cómo obtener un seguimiento de pila cuando falla el programa C++? (usando msvc8/2005)
- 22. ¿Cuál es el rango válido para el valor de retorno del programa en Linux/bash?
- 23. Salida de color del programa ejecutado bajo BASH
- 24. ¿Cómo imprimir más cuando falla la aserción?
- 25. Código de salida del proceso cuando se mata el proceso forzosamente
- 26. ¿Cuál es el formato de salida de SHA256
- 27. ¿Es posible obtener el código de salida de una subshell?
- 28. ¿Por qué assert simplemente termina un programa compilado para iPhone?
- 29. Programa ha salido con el código -2147483645
- 30. Assert IEnumerables
Esta es una respuesta fantástica, y 134 es exactamente lo que obtengo. –
Parece que el enlace a la documentación de GCC no contiene nada de interés, ni puedo encontrar la cotización que ha realizado. –
¿Podría cambiar el enlace glibc doco para señalar directamente aquí a menos que me haya perdido algo? http://www.gnu.org/s/libc/manual/html_node/Exit-Status.html#Exit-Status –