Lorsqu'un appel assert()
échoue, quel est le code de sortie utilisé et où est-il documenté?Lorsque assert() échoue, quel est le code de sortie du programme?
Répondre
C99 norme stipule que assert
appels abort
et les abort
états stuff ce sur le code de retour:
Une forme définie par l'implémentation de l'état sans succès la résiliation est retourné à l'environnement hôte au moyen de la fonction appel relance (SIGABRT).
Il est documenté dans la section 7.2.1.1 (assert) et 7.20.4.1 (abandon) de la norme C99 here.
De nombreux systèmes UNIX renverront 128 plus le numéro de signal (SIGABRT est le numéro de signal 6) de sorte que vous pouvez obtenir 134. Quoi que vous obteniez, il devrait être documenté par l'implémentation C.
Par exemple, voir here pour gcc. Bien que ce soit assez silencieux sur ce qui est renvoyé à l'environnement appelant. Des sections spécifiques here:
Certains choix sont faits par la bibliothèque et le système d'exploitation (ou tout autre environnement lors de la compilation pour un environnement autonome); reportez-vous à leur documentation pour plus de détails.
Et here:
Le comportement de la plupart de ces points dépendent de la mise en œuvre de la bibliothèque C, et ne sont pas définis par GCC lui-même.
Ainsi est le docd de la glibc here à la fin du programme (en particulier le bit d'état de sortie). Il mentionne des conventions mais pas de règles fermes.
Il est spécifique à l'implémentation. Vous pouvez le faire:
int main()
{
assert(0);
}
Ensuite, exécutez:
> ./a.out
> echo $?
1 (<- or whatever)
Ça va au moins vous dire à quoi vous attendre pour votre configuration. Je gettitng 134 sur quelques boîtes Linux avec gcc et g ++.
Vous devriez toujours sauvegarder vos réponses avec une référence spécifique à la norme. – wilhelmtell
Les compilateurs ne suivent pas toujours la norme au T. (Je vous regarde Microsoft) S'il est bon de savoir ce que dit la norme, il est tout aussi bon de savoir ce que les compilateurs font vraiment. Ce qu'ils devraient faire n'est pas toujours ce qu'ils font réellement. Cela et la norme n'est pas réellement gratuite. –
Je travaillais avec des files d'attente de messages posix j'ai eu la même erreur mq_open a échoué avec errono 38 (ENOSYS).
Le travail consiste à reconstruire le noyau avec POSIX MESSGE QUEUE activé dans la configuration du noyau.
Cela va construire le noyau avec la prise en charge de la file de messages POSIX et cela a fonctionné pour moi.
Remerciez
Je pense que vous vouliez mettre cette réponse sur une autre question. –
Je ne peux pas trouver la spécification réelle pour elle (POSIX un peu difficile à la recherche), mais je ne trouve une référence.
Une assertion lancée génère un état de sortie identique à celui que EXIT_FAILURE
étend (reference).Puisque vous avez affaire à Linux, vous avez aussi affaire à POSIX, qui définit en outre le comportement de c99.
C'est une réponse fantastique, et 134 est exactement ce que je reçois. –
La documentation liée à GCC ne semble pas contenir d'intérêt, et je ne peux pas trouver la citation que vous avez faite. –
Vous pouvez changer le lien de la glibc doco pour pointer directement ici, sauf si j'ai raté quelque chose? http://www.gnu.org/s/libc/manual/html_node/Exit-Status.html#Exit-Status –