Toutes les façons de satisfaire une condition
Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 4 — Discipline de programmation, validation et test
Énoncé
On teste if (a > 0 || b > 0). Un collègue propose le jeu de tests : il couvre les deux branches. Que laisse-t-il passer ? Et combien de cas faut-il pour if (a && b || c) ?
Corrigé
Les quatre cas, et les deux qui comptent :
| avec `||` | avec `&&` | séparent-ils ? | ||
|---|---|---|---|---|
| V | V | vrai | vrai | non |
| V | F | vrai | faux | OUI |
| F | V | vrai | faux | OUI |
| F | F | faux | faux | non |
Le jeu atteint la couverture des arcs — les deux branches du if sont prises — et pourtant il ne distingue pas || de &&. Une faute de frappe sur l'opérateur, la plus banale qui soit, passe intégralement. Il faut ou , c'est-à-dire précisément les lignes que la couverture des arcs n'exige pas.
C'est l'exigence du programme officiel : « ne pas se contenter de [traiter la condition] comme étant globalement vraie ou fausse mais formuler des tests qui réalisent toutes les possibilités de la satisfaire ».
Trois termes : huit combinaisons, cinq exécutions. Pour a && b || c, l'évaluation paresseuse fusionne des cas. Mesuré :
| évalué ? | évalué ? | résultat | |||
|---|---|---|---|---|---|
| F | --- | F | non | oui | F |
| F | --- | V | non | oui | V |
| V | F | F | oui | oui | F |
| V | F | V | oui | oui | V |
| V | V | --- | oui | non | V |
Il reste cinq exécutions distinctes, et non huit : quand est faux, la valeur de n'a aucun effet ; quand et sont vrais, celle de non plus. Un jeu de tests complet compte donc cinq cas, et non .
C'est le même phénomène qu'à l'exercice 1.3, vu de l'autre côté. Là-bas, l'ordre du && protégeait un accès ; ici, il supprime des cas de test. Dans if (i < n && t[i] == 0), la ligne « et » n'est pas un cas qu'on oublierait : elle n'existe pas. Chercher à l'atteindre est une perte de temps, et vouloir la couvrir mène à écrire du code mort.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.