Adloun

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 ?
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.

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.