• Aucun résultat trouvé

Diagnostic partiel `a partir d’une analyse dynamique sur une slice 81

Dans le document The DART-Europe E-theses Portal (Page 96-99)

Partie II Contributions 65

4.5 L’analyse dynamique

4.5.3 Diagnostic partiel `a partir d’une analyse dynamique sur une slice 81

Dans notre m´ethode, nous allons appliquerDA`a plusieurs versions simplifi´esp1, p2, . . . , pm dep. Cependant, le diagnostic produit parDA sur uneslice pj (1≤j ≤m) pour une alarme depne donne pas toujours le statut r´eel de cette menace dans le programme initial p. Dans certains cas, une alarme peut ˆetre une erreur confirm´ee sur la version simplifi´eepj, alors que dans le programme initial son statut peut rester inconnu ou mˆeme safe. En re-vanche, si le diagnostic produit parDAsur pj pour une alarme estsafe, alors cette alarme ne repr´esente aucun risque d’erreur dans le programme initial p (nous allons le prouver dans la partie 4.9). Pour mieux expliquer ce ph´enom`ene d’apparition d’erreur dans les slices, consid´erons deux situations que nous illustrons par des exemples. Soit Aj ⊂ A le sous-ensemble d’alarmes de Apr´eserv´ees dans la slice pj.

Une erreur pour une alarme a ∈ Aj peut se produire dans la slice pj sur un ´etat d’entr´ee s sans se produire dans p si l’ex´ecution de p sur s n’atteint pas l’instruction mena¸cante correspondante la. Cela peut ˆetre dˆu `a une partie avant la qui boucle et ne termine pas dans le programme p et qui n’est plus pr´esente dans la version simplifi´ee.

Cette situation peut ˆetre illustr´ee par l’exemple suivant : 0 i n t f1 (i n t x , i n t y ){

o`u on suppose que la variableypeut ˆetre nulle, la fonctiong(x,y)ne termine pas et l’appel g(x,y); n’est pas une d´ependance pour la ligne 3. Dans ce cas, la slice par rapport `a la ligne 3 est la suivante :

Elle contient en effet une erreur pour l’alarme de la ligne 3 (pouvant ˆetre confirm´ee pour les entr´ees (x,y)=(1,0) par exemple) qui ne se produit jamais dans le programme initial o`u l’ex´ecution boucle infiniment sans jamais arriver `a la ligne 3.

Une autre cause possible d’apparition d’erreur dans les slices peut ˆetre li´ee au ph´eno-m`ene des erreurs cach´ees. Une erreur pour une alarme a ∈ Aj peut se produire dans la slice pj sur un ´etat d’entr´ee s sans se produire dans p si l’ex´ecution de p sur s produit une autre erreur avant l’instruction mena¸cantela. Par exemple, consid´erons le programme suivant :

o`u la variable c peut ˆetre nulle. Dans ce cas, laslice par rapport `a la ligne 4 0 void f2 (i n t x , i n t y , i n t c ){

1 i n t b ;

4 b = y / c ; // Alarm : c may be 0

6 return;

7 }

provoque une erreur pour l’alarme de la ligne 4 (par exemple, sur (x,y,c)=(5,10,0)) alors que l’ex´ecution du programme initial ne produit pas d’erreur pour cette ligne car l’ex´ecution s’arrˆete suite `a une erreur de division par z´ero `a la ligne 2. Nous voyons que l’erreur de la ligne 2 cache l’erreur de la ligne 4 dans le programme initial. Une erreur cach´ee peut se produire dans le programme simplifi´e `a cause de la simplification.

Dans la m´ethode sante, pour ´eliminer toute incertitude sur le statut d’une menace a pour laquelle DA sur une slice pj a retourn´e (bug, s), nous proposons de confirmer ce statut par l’ex´ecution du programme initial p sur s. L’ex´ecution concr`ete dep est imm´e-diate, et permet de r´epondre pr´ecis´ement si l’´etat d’entr´ee s provoque une erreur sur p pour la menace a ou non. Si l’erreur pour la menace a se produit dans p, nous pouvons confirmer le diagnostic (bug, s) pour a dans p. Si cette erreur ne se produit pas dans p, alors le statut de l’alarmeadanspreste inconnu tant que cette alarme n’est pas confirm´ee par l’ex´ecution de psur un autre ´etat d’entr´ee.

Dans ce cas, si lors de l’ex´ecution de psur s, une erreur pour une autre alarme a ∈A se produit dansp, cette information sera conserv´ee et le diagnostic (bug, s) sera ´emis pour a dans p. Nous pouvons ´emettre un avertissement pour attirer l’attention sur l’alarmea, qui peut ˆetre une erreur cach´ee, mais nous ne pouvons pas conclure sur le statut exact dea. Pour simplifier la pr´esentation, ce type d’avertissement n’est pas repr´esent´e dans la pr´esentation formelle de la m´ethode et le diagnostic.

Si l’ex´ecution depsur sne termine pas (dans un d´elai fix´e), ce cas de non terminaison doit ˆetre rapport´e et analys´e pour d´etecter une ´eventuelle erreur menant `a la non termi-naison. La d´etection de la non terminaison ´etant un probl`eme ind´ecidable dont l’´etude ne

4.5. L’analyse dynamique fait pas partie des objectifs de cette th`ese, nous nous limitons `a signaler les ´eventuels cas d´etect´es de non terminaison (dans un d´elai fix´e) et n’incluons pas ces avertissements dans la formalisation de la m´ethode et le diagnostic.

En pratique, dans nos exp´erimentations pr´esent´ees dans cette th`ese, l’ex´ecution du programme initial a toujours confirm´e le statut d’erreur rapport´e par DA sur une slice.

Nous pouvons maintenant donner la d´efinition formelle du diagnosticDiagnosticj pour les alarmes de p`a partir des r´esultats obtenus par DA sur une slice pj (1≤j ≤m).

D´efinition 2 (Diagnostic `a partir d’une slice)

Le diagnostic Diagnosticj pour les alarmes de p`a partir d’une analyse dynamique sur la slice pj est d´efini pour tout a∈A comme suit.

1. Diagnosticj(a) =safe sia ∈Aj et DA sur la slice pj a class´e a comme safe.

2. Diagnosticj(a) = (bug, s) si a ∈ Aj, DA sur la slice pj a retourn´e (bug, s) pour a et l’ex´ecution de p sur s confirme l’erreur pour la menace a dans p.

3. Diagnosticj(a) = (bug, s) si l’ex´ecution de p sur s (lors d’une tentative de confirmer le statut d’erreur d’une autre menace a ∈Aj pour laquelle DA sur la slice pj a retourn´e (bug, s)) provoque l’erreur pour la menace a dans p avant d’arriver `a a.

4. Diagnosticj(a) =unknown dans tous les autres cas.

4.5.4 Fusion de diagnostics et construction du diagnostic final

LorsqueDA est appliqu´e `a plusieurs versions simplifi´eesp1, p2, . . . , pm dep et qu’ainsi plusieurs diagnostics pour les alarmes de p sont obtenus, nous avons besoin de cumuler ces diagnostics pour obtenir un diagnostic final.

Montrons d’abord que les diagnosticsDiagnosticj etDiagnostick (sij 6=k) obtenus `a partir des r´esultats deDA sur deuxslices pj etpkne peuvent pas produire deux r´esultats contradictoires safe et bug. Si l’un des diagnostics est bug, alors une erreur se produit r´eellement pour a dans p (voir la d´efinition 2). On prouve dans la partie 4.9 que si DA sur uneslice produit le diagnosticsafe pour une alarmea, alors il n’y a aucun risque d’er-reur pour asur p. Par cons´equent, les diagnosticsDiagnosticj etDiagnostickne peuvent pas produire en mˆeme temps deux diagnostics contradictoires safe etbugpour une mˆeme alarme a.

Cette propri´et´e de non contradiction entre les diagnostics nous permet d’introduire l’op´eration de fusion de diagnostics par la d´efinition suivante.

D´efinition 3 (Fusion de Diagnostics)

Soit pun programme et A un ensemble d’alarmes pr´esentes dansp. Soient Diagnostic et Diagnostic′′ deux diagnostics pour l’ensembleA d’alarmes de p. La fusion des diagnostics

Diagnostic etDiagnostic′′, not´eeDiagnostic⊎Diagnostic′′, est d´efinie comme suit pour toute alarme a de A :

1. Diagnostic ⊎Diagnostic′′(a) = safe si Diagnostic(a) = safe ou Diagnostic′′(a) = safe.

2.Diagnostic⊎Diagnostic′′(a) = (bug, s)siDiagnostic(a) = (bug, s)ouDiagnostic′′(a) = (bug, s).

3. Diagnostic⊎Diagnostic′′(a) =unknown dans tous les autres cas.

Pour la pr´esentation des algorithmes de la m´ethode santeci-dessous, il sera pratique d’avoir une repr´esentation des diagnostics en termes d’ensembles d’alarmes de chaque statut. SoientDiagnostic etDiagnostic′′deux diagnostics pour l’ensemble Ades alarmes de p, et soit Diagnostic = Diagnostic ⊎Diagnostic′′ leur fusion. Soient S, B, U les ensembles d’alarmes pour lesquels le diagnostic Diagnostic retourne, respectivement, safe,bugetunknown. SoientS′′, B′′, U′′les ensembles d’alarmes pour lesquels le diagnostic Diagnostic′′ retourne, respectivement, safe, bug et unknown. Alors les ensembles S, B, U d’alarmes pour lesquels le diagnostic Diagnostic retourne, respectivement, safe, bug et unknown, peuvent ˆetre calcul´es de la mani`ere suivante :

S = S∪S′′, B = B∪B′′, U = A−(S∪B).

On utilisera ´egalement dans ce cas la notation (S, B, U) = (S, B, U)⊎(S′′, B′′, U′′), ou mˆeme (S, B, U) = (S, B, U)⊎Diagnostic′′. Il est clair que la fusion de diagnostics est une op´eration commutative et associative.

Dans la m´ethode sante, le diagnostic final sera construit par fusion des diagnostics obtenus pour les alarmes de p `a partir de l’application de DA sur les versions simplifi´ees p1, p2, . . . , pm dep.

Dans le document The DART-Europe E-theses Portal (Page 96-99)