C Language Affirmation de code inaccessible


Exemple

Au cours du développement, lorsque certains chemins de code doivent être empêchés d'atteindre le flux de contrôle, vous pouvez utiliser assert(0) pour indiquer qu'une telle condition est erronée:

switch (color) {
    case COLOR_RED:
    case COLOR_GREEN:
    case COLOR_BLUE:
        break;

    default:
        assert(0);
}

Chaque fois que l'argument de la macro assert() évalué faux, la macro écrit des informations de diagnostic dans le flux d'erreur standard, puis abandonne le programme. Ces informations incluent le fichier et le numéro de ligne de l'instruction assert() et peuvent être très utiles lors du débogage. Les assertions peuvent être désactivées en définissant la macro NDEBUG .

Une autre façon de terminer un programme en cas d'erreur est d'utiliser les fonctions de bibliothèque standard exit , quick_exit ou abort . exit et quick_exit prenez un argument qui peut être renvoyé à votre environnement. abort() (et donc assert ) peut être une terminaison très grave de votre programme, et certains nettoyages qui seraient normalement effectués à la fin de l'exécution peuvent ne pas être exécutés.

Le principal avantage d’ assert() est qu’il imprime automatiquement les informations de débogage. L'appel à abort() présente l'avantage de ne pas pouvoir être désactivé comme une assertion, mais cela risque de ne pas entraîner l'affichage d'informations de débogage. Dans certaines situations, l'utilisation des deux concepts peut être bénéfique:

if (color == COLOR_RED || color == COLOR_GREEN) {
   ...
} else if (color == COLOR_BLUE) {
   ...
} else {
   assert(0), abort();
}

Lorsque les assertions sont activées , l'appel assert() imprimera les informations de débogage et mettra fin au programme. L'exécution n'atteint jamais l'appel abort() . Lorsque les assertions sont désactivées , l'appel assert() ne fait rien et abort() est appelé. Cela garantit que le programme se termine toujours pour cette condition d'erreur; L'activation et la désactivation n'affectent que les effets de l'impression ou non de la sortie de débogage.

Vous ne devriez jamais laisser un tel assert dans le code de production, car les informations de débogage ne sont pas utiles pour les utilisateurs finaux et parce que abort est généralement une terminaison beaucoup trop sévère qui empêchent les gestionnaires de nettoyage qui sont installés pour la exit ou quick_exit à courir.