• Aucun résultat trouvé

Un exemple de programme L4 n’est ex ´ecut ´ee que si la variable x est ´egale

L0 : f u n c t i o n ( x ) { L1 : y : = 2 * x ; L2 : i f ( y > 0 ) { L3 : i f ( x − 2 < 0 ) { L4 : / / ERROR } } }

`a0 apr`es ex´ecution de l’instruction y := 2 ∗ x en L1. Par cons´equent, la condition y > 0

de la ligne L2 sera toujours fausse et le programme ne passera ni par la ligne L3 ni par

la ligne L4. Si x vaut1, la variable y sera ´egale `a 2 apr`es ex´ecution de l’instruction en L1.

Les conditions en L2 et L3 sont toutes deux vraies car2 > 0 et 1 − 2 < 0. L’instruction en

L4 sera donc ex ´ecut ´ee, ce qui est l’objectif. Si x est sup ´erieure `a1 (donc sup´erieure ou

´egale `a2), la variable y sera sup´erieure ou ´egale `a 4 apr`es ex´ecution de l’instruction L1.

La condition de la ligne L2 sera vraie car y ≥ 4 =⇒ y > 0. La condition de la ligne L3

sera en revanche fausse car x ≥2 =⇒ x − 2 ≥ 0, autrement dit x ≥ 2 =⇒ ¬(x − 2 < 0).

L’ex ´ecution symbolique de la fonction function afin d’amener le programme `a ex ´ecuter

la ligne L4 doit donc permettre de d ´eterminer la valeur1 pour la variable x.

3.3.1/ EXPLORATION SYMBOLIQUE

Cette section pr ´esente le principe d’exploration symbolique [S. Boyer et al., 1975, Howden, 1977, King, 1975, King, 1976] en 3.3.1.1 et les limitations de cette m ´ethode en 3.3.1.2.

3.3.1.1/ PRINCIPE GEN´ ERAL´

Le principe de l’exploration symbolique pour le programme de la figure 3.3 consiste `a associer `a x une valeur symbolique, c’est- `a-dire une valeur `a laquelle des contraintes sont associ ´ees au cours de l’ex ´ecution du programme sans pour autant qu’une valeur exacte ne lui soit affect ´ee. On note φ la valeur symbolique associ ´ee `a x.

La seule contrainte initialement associ ´ee `a φ est φ ∈ Z car x appartient `a l’ensemble

des entiers relatifs. La ligne L1 affecte `a y la valeur2 ∗ φ, sous-entendu deux fois une

valeur de l’ensemble Z. L’ ´evaluation de la condition de la ligne L2 revient alors `a ´evaluer

2 ∗ φ > 0 qui est vraie pour toute valeur de φ sup´erieure `a 0, et fausse pour toute valeur de φ inf´erieure ou ´egale `a 0. L’ex´ecution symbolique suit donc les deux chemins possibles

en m ´emorisant les contraintes n ´ecessaires pour suivre chacun des chemins :2 ∗ φ > 0

pour passer `a L3 et2 ∗ φ ≤ 0 pour ne pas entrer dans la condition.

Lorsque la condition en L2 est ´evalu ´ee `a faux, l’ex ´ecution de la fonction se termine car il n’existe plus aucune instruction `a ex ´ecuter et L4 n’est donc pas d ´eclench ´ee. Ce chemin n’est donc pas celui qui nous int ´eresse. Si on souhaite malgr ´e tout obtenir une valeur de

xqui permette de ne pas passer par L4, on peut utiliser un solveur de contraintes (SMT

pourrait ˆetre φ = 0 par exemple et l’entr´ee x = 0 permet donc de tester le cas ou la ligne L4 n’est pas ex ´ecut ´ee.

Lorsque la condition en L2 est ´evalu ´ee `a vrai en revanche, donc lorsqu’il existe une valeur de φ telle que φ ∈ Z∧2∗φ > 0, la condition de la ligne L3 est ´evalu ´ee. L’ ´evaluation effectu ´ee

est alors φ −2 < 0, et on construit `a nouveau deux chemins : l’un o`u φ − 2 < 0 et l’autre o`u

¬(φ − 2 < 0), ces deux conditions pouvant en effet ˆetre satisfaites. Si la condition en L3

est fausse, la fonction termine et ce chemin ne nous int ´eresse donc pas.

Si la condition en L3 est vraie, la contrainte pour la variable φ est la suivante : φ ∈ Z∧2∗φ > 0 ∧ φ − 2 < 0. L’instruction en L4 est ensuite ex´ecut´ee et ce dernier chemin va donc nous int ´eresser. A l’aide d’un solveur SMT, on peut donc demander un mod `ele pour la contrainte φ ∈ Z ∧ 2 ∗ φ > 0 ∧ φ − 2 < 0. Le seul mod `ele satisfaisant cette contrainte est φ = 1. Ainsi, x = 1 est une entr´ee qui am`enera la fonction `a ex´ecuter la ligne L4.

3.3.1.2/ LIMITATIONS

L’ex ´ecution symbolique poss `ede un certain nombre de limitations qui emp ˆechent parfois son application. La principale limitation concerne son efficacit ´e qui d ´epend du nombre de branchements `a consid ´erer (c’est- `a-dire du nombre de chemins ´etudi ´es). En effet, les appels aux solveurs sont g ´en ´eralement co ˆuteux en temps et leur nombre est pro- portionnel au nombre de chemins emprunt ´es lors de l’exploration symbolique. Le pas- sage `a l’ ´echelle sur des programmes de taille cons ´equente est donc compromis. Une deuxi `eme limitation importante vient de l’incapacit ´e des solveurs `a r ´esoudre certaines contraintes [Bradley et al., 2010]. Typiquement, certains solveurs sont incapables de

g ´erer des contraintes non lin ´eaires. La ligne L1 du programme de la figure 3.3 (y:= 2 ∗ x)

g ´en `ere une contrainte lin ´eaire facilement r ´esolue par la plupart des solveurs classiques.

Si on remplace cette ligne par y := x ∗ x en revanche, la contrainte n’est plus lin´eaire

et certains solveurs seront incapables d’assigner une valeur aux diff ´erentes variables du programme.

3.3.2/ EXPLORATION CONCOLIQUE

L’exploration dite concolique vise `a r ´esoudre les limitations de l’exploration symbo-

lique. Elle combine l’exploration concr `ete et l’exploration dynamique (le terme conco-

liquevient de la concat ´enation deconcr `ete etsymbolique). Consid ´erons le pro-

gramme de la figure 3.4 qui reprend celui de la figure 3.3 avec cette fois une contrainte non lin ´eaire due `a la ligne L1.

L’exploration concolique consid `ere que x est donn ´ee initialement (supposons qu’elle vaut 0). L’ex´ecution concr`ete associe `a y la valeur 0 ∗ 0 donc 0 et l’exploration symbolique consid ´erera y comme le calcul φ ∗ φ, o `u φ est la variable symbolique associ ´ee `a x. Au

niveau concret, la condition de la ligne L2 devient 0 > 0, ce qui est faux et le pro-

gramme n’ex ´ecutera donc ni L3, ni L4. Afin de passer par un autre chemin (un susceptible

d’ex ´ecuter L4), il faut donc que x soit diff ´erent de 0. Imaginons que le solveur r´esolve la

contrainte x , 0 avec x = −1. On a alors y = −1 ∗ −1 = 1 et toujours le calcul φ ∗ φ pour remplacer y au niveau symbolique.

Au niveau symbolique, la contrainte ayant pr ´ec ´edemment permis d’emprunter le chemin L0, L1, L2 et de terminer le programme sans passer par L3 ni L4 ´etait ¬(φ ∗ φ > 0) ou