Aller au contenu
Topos Uranos

Résumé

Cette leçon clôt la huitième unité et, avec elle, le cours. Elle rassemble l’acquis des trois leçons de l’unité ; elle reconstruit la chaîne des concepts qui va de l’interface d’un module au débogage comme méthode ; elle sépare ce qui, de tout cela, vaut dans tout langage de ce qui est propre à C++ ; elle montre la violation de la règle de la définition unique que personne ne diagnostique et réunit dans une liste tout le comportement indéfini du cours, avec ce qui détecte chaque cas ; elle reprend dans son évaluation de sortie les savoir-faire de l’évaluation d’entrée ; elle propose six défis qui combinent l’unité ; et elle se termine par le projet final du cours, spécifié avec précision, avec sa grille d’évaluation, en quatre étapes, chacune avec une solution de référence vérifiée.

Objectifs d’apprentissage

  1. Organiser un programme en plusieurs modules avec des en-têtes, des gardes et des contrats, le compiler séparément et diagnostiquer les messages de l’éditeur de liens.
  2. Tester un module à partir de sa spécification, avec un programme de tests automatisés exécuté sous les détecteurs, et vérifier par des assertions ce qui ne peut pas arriver.
  3. Localiser un défaut avec une méthode (reproduire, réduire, formuler des hypothèses, procéder par dichotomie) et avec le débogueur, et documenter l’enquête.
  4. Reconnaître le comportement indéfini que le cours a montré, avec ce qui détecte chaque cas, et la violation de la règle de la définition unique que personne ne diagnostique.
  5. Intégrer tout le cours dans un projet : spécifier, décomposer, construire, tester, mesurer le coût et déboguer un programme de gestion de données tabulaires.

L’acquis de l’unité

L’unité s’était proposé d’enseigner à organiser, vérifier et déboguer des programmes qui ne tiennent plus dans un fichier ni dans la tête. Le but a été atteint en s’appuyant sur ce que l’introduction tenait pour acquis : la déclaration et la définition, la compilation et l’édition de liens, le contrat, l’invariant et la recherche dichotomique. Le programme du catalogue de livres qui ouvrait l’unité, qui tenait dans un fichier, copiait parseInt une fois de plus et omettait en silence « Cien años de soledad » parce qu’il écrivait < là où la spécification disait « les deux inclus », est réécrit dans la dernière section de cette leçon comme projet final : quatre modules avec des contrats, un programme principal qui répond à des commandes et un programme de tests de vingt-cinq cas. Deux de ces cas, « entre, frontières » et « entre, une année », échouent avec la condition du programme d’origine, et c’est pourquoi le défaut ne pourrait pas revenir sans que personne le remarque.

Plusieurs fichiers et bibliothèques personnelles

La leçon Plusieurs fichiers et bibliothèques personnelles a divisé un programme en un en-tête qui déclare, un fichier d’implémentation qui définit et un main.cpp qui utilise. Elle a présenté les gardes d’inclusion, qui empêchent la double inclusion à l’intérieur d’une unité de traduction ; la règle de la définition unique, qui explique « multiple definition » et « undefined reference » et donne à inline son sens actuel de permission ; la compilation séparée avec -c, qui ne recompile que les objets dont les sources ou les en-têtes ont changé ; et une bibliothèque personnelle avec des fonctions de leçons antérieures.

Tester

La leçon Tester a appris à dériver les cas d’une spécification, par régions, frontières et cas particuliers, avec le résultat attendu calculé par une autre voie ; à écrire un programme de tests automatisés qui ne signale que les échecs et se termine avec le code de sortie 0 ou 1 ; à utiliser assert pour ce qui ne peut pas arriver, en sachant que -DNDEBUG l’efface avec sa condition ; à tester à la compilation avec static_assert et constexpr ; et à exécuter les tests avec les détecteurs (celui des erreurs de mémoire, AddressSanitizer, et celui du comportement indéfini, UndefinedBehaviorSanitizer). Tout repose sur l’avertissement de Dijkstra : un test montre la présence de défauts, jamais leur absence.

Déboguer

La leçon Déboguer a présenté le débogage comme une méthode expérimentale : reproduire la défaillance, formuler des hypothèses réfutables, trancher entre elles par des expériences et procéder par dichotomie sur la portion suspecte. Elle a développé l’instrument (-g sans optimisation, la configuration de Visual Studio Code sur les trois systèmes, une session réelle de GDB, les points d’arrêt simples et conditionnels, les pas et la pile d’appels) et les stratégies qui valent plus que lui : réduire le cas, chercher le dernier point correct avec des assertions et commencer par le premier cadre de son propre code dans le rapport du détecteur.