• Aucun résultat trouvé

III.2 Spécification de la couverture des expressions pour mCaml

III.2.2 Taux de couverture

Le tauxτ de couverture structurelle simple des expressions pour un programme P est alors le ratio

entre le nombre d’expressions couvertes et le nombre total d’expressions.

τ = {e ∈ P C(e)} {e ∈ P } {e ∈ P }

est le cardinal de l’ensemble des expressionse qu’on peut distinguer dans le programme P et

{e ∈ P C(e)}

est le cardinal de l’ensemble des expressionse qu’on peut distinguer dans le

programmeP qui satisfont le prédicat C.

III.3 Conclusion du chapitre

Nous avons présenté le langage mCaml (en laissant sa définition formelle complète en annexe). Ce langage servira de base pour le reste de cette thèse. Nous avons également défini formellement la couverture des expressions pour ce même langage.

Le chapitre suivant se consacrera à des critères plus complexes de couverture de code structurelle, qui font intervenir les notions de condition et de décision.

IV

chapitre

Couverture des conditions

et des décisions pour mCaml

«Condition : A Boolean expression containing no Boolean operators. Decision : A Boolean expression composed of conditions and zero or more Boolean operators. A decision without a Boolean operator is a condition. If a condition appears more than once in a decision, each occurrence is a distinct condition.» – DO-178B [73]

Sommaire

IV.1 Critères de couverture pour les expressions booléennes . . . . 62 IV.1.1 Couverture des conditions (CC) . . . . 62 IV.1.2 Couverture des décisions (DC) . . . . 63 IV.1.3 Couverture des conditions/décisions (C/DC) . . . . 63 IV.1.4 Couverture des conditions multiples (MCC) . . . . 63 IV.1.5 Couverture des conditions/décisions modifiée (MC/DC) . . . . 64 IV.1.6 Autres critères de couverture pour les expressions booléennes . . . . . 69 IV.2 Conditions et décisions pour mCaml : quatre sémantiques formelles . . . 71 IV.2.1 Notations . . . . 71 IV.2.2 Sémantique 1 : repérage syntaxique aux branchements conditionnels . 72 IV.2.3 Sémantique 2 : sémantique intermédiaire, généralisation aux

opéra-teurs booléens . . . . 74 IV.2.4 Sémantique 3 : une extension de la sémantique 2, généralisation aux

applications à retour booléen . . . . 77 IV.2.5 Sémantique 4 : généralisation aux expressions booléennes . . . . 78 IV.3 Choix de la sémantique . . . . 84 IV.4 Fonction de comptage des conditions d’une expression . . . . 84 IV.5 Conclusion du chapitre . . . . 85

Résumé du chapitre 4

Ce chapitre présente premièrement différentes définitions pour les notions de conditions et de décisions dans le cadre de la couverture structurelle de code mCaml, dont MC/DC. La richesse du langage mCaml entraîne une difficulté d’interprétation et d’application des notions classiquement appliquées à de petits sous-ensembles des langages Ada (e.g., SPARK) ou C.

Deuxièmement, nous définissons formellement les notions de conditions et décisions ap-pliquées seules puis apap-pliquées combinées au sein de critères complexes de couverture, tels que MC/DC (couverture des conditions/décisions modifiées).

léennes.

Les branchements conditionnels sont déterminés à partir de l’évaluation d’expressions boo-léennes. Si la valeur de ces expressions ne change jamais, alors il y a potentiellement une erreur. En effet, un branchement conditionnel dont la condition ne varie jamais n’est pas vraiment « condition-nel ». Alors pourquoi utiliser un branchement conditioncondition-nel ? Serait-ce une condition erronée ou une mauvaise structure du code ? Il est alors utile de chercher la raison pour laquelle un tel branchement existe dans un code.

Par exemple,

if (x = 0) || (x <> 0) then something() else somethingElse()

Les branchements conditionnels inconditionnels ? Quelques fois, on veut justement vérifier qu’une condition reste toujours constante, et signaler une erreur si elle varie, il s’agit de ce qui est communément appelé « assertions. » Mais ces cas sont une minorité des utilisations des expressions conditionnelles. Lorsque ces cas sont rencontrés, la couverture ne pourra être satisfaite. Dans le cadre d’un développement sous le contrôle d’une autorité de certification, il faudra probablement justifier leurs présences.

Par exemple,

if x then () else somethingWrong()

Deux catégories d’expressions booléennes. Lorsque l’on parcourt la littérature, on trouve deux notions pour distinguer deux catégories d’expressions booléennes : les conditions et les décisions. Intuitivement, les décisions sont les expressions booléennes qui se situent avant les branchements, et les conditions sont les expressions booléennes qui composent les décisions. Une décision peut alors être composée d’une ou de plusieurs conditions. Par exemple, l’expression(x1 || x2)est une décision composée de deux conditions qui sont les variablesx1etx2.

Pour un langage tout à fait minimal, ces définitions intuitives sont suffisantes. Mais dès que le langage s’enrichit un peu, elles deviennes ambiguës car les contextes peuvent rapidement devenir compliqués. Notamment pour un langage comme mCaml, nous verrons qu’il faut faire des choix d’in-terprétation.

Dans la suite de ce chapitre, nous consacrons d’abord une large section aux définitions de dif-férents critères de couverture de code pour les expressions booléennes, dont le critère MC/DC. Cela permettra de mieux comprendre les impacts des définitions des notions de « condition » et de « déci-sion » pour un langage d’expresdéci-sions riche.

Ensuite, une seconde large section sera consacrée à définir formellement ces deux notions pour notre langage mCaml. Nous verrons ainsi les problématiques de choix d’interprétation de définitions simples appliquées à un langage riche. Cette section fournira quatre définitions, graduellement enri-chies, des notions de condition et de décision pour mCaml.

IV.1 Critères de couverture pour les expressions booléennes

Cette section porte sur les critères de couverture conditionnelle classiquement rencontrés dans la littérature. Nous gravirons une échelle de complexité en partant d’un critère simple, celui de la couverture des conditions, pour arriver au fameux critère MC/DC.

Les définitions proposées dans cette section ne portent pas particulièrement sur mCaml, mais plutôt sur les langages de programmation en général. Ces définitions serviront alors de base et lorsque ce sera nécessaire, elles seront raffinées. D’autre part, les notions de « condition » et de « décision » utilisées dans cette section sont « génériques », en ce sens que quelles que soient les variantes des définitions utilisées pour ces deux mots, les définitions proposées dans cette section ne devraient pas en être impactées.

On peut toutefois affirmer que dans tous les cas, une condition et une décision sont des expressions booléennes.

Les valeurs booléennes ne sont pas les mêmes dans tous les langages. En C, un mot (e.g., un entier, un flottant, une adresse mémoire) dont tous les bits sont à 0 représente faux, et tous les autres mots représentent vrai. En Java, nous avons les valeurs primitivestrueetfalse, comme pour ML.

En même temps, on peut dire que le type des booléens est représenté et représentable par deux ensembles de valeurs (qui sont souvent chacun des singletons mais pas toujours).

Ici, on choisit effectivement de ne considérer que les deux valeurstrueetfalse.