Adloun

informatique (MP2I/MPI) · Chapitre 4 · Exercice de TD

Toutes les façons de satisfaire une condition

Discipline de programmation, validation et test · niveau 2

É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 ?
VVvraivrainon
VFvraifauxOUI
FVvraifauxOUI
FFfauxfauxnon

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—FnonouiF
F—VnonouiV
VFFouiouiF
VFVouiouiV
VV—ouinonV

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 .

iRemarqueLa paresse comme réduction du domaine de test

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.

Exercices semblables

Le cours du chapitre · Tous les exercices du chapitre