L'exécution symbolique est un cas d'interprétation abstraite?


Réponses:


22

Je n'ai pas connaissance d'un article concernant la comparaison entre l'exécution symbolique et l'interprétation abstraite. Je ne pense pas non plus qu'il en soit besoin. La lecture des descriptions originales de ces deux techniques devrait suffire.

  • King, Exécution symbolique et test de programme , 1976
  • Cousot, Cousot, Abstract Interpretation: a Unified Lattice Model for Static Analysis of Programs by Construction of Approximation of Fixpoints , 1977

(Inversement, s'il y avait une connexion inattendue, cela mériterait d'être décrit. Mais je doute fort que ce soit le cas.)

L'idée principale de l'exécution symbolique est qu'à un moment arbitraire de l'exécution, vous pouvez exprimer les valeurs de toutes les variables en fonction des valeurs initiales. L'idée principale de l'interprétation abstraite est que vous pouvez explorer systématiquement toutes les exécutions d'un programme par une série de sur-approximations. (Je peux entendre plusieurs amateurs d'IA grogner à la précédente approximation.)

Ainsi, au moins dans la formulation originale, l'exécution symbolique ne visait pas à explorer toutes les exécutions possibles. Vous pouvez le voir même dans le titre: il comprend le mot «testing». Mais voici plus de la section 8: "Pour les programmes avec des arbres d'exécution infinis, le test symbolique ne peut pas être exhaustif et aucune preuve absolue de correction ne peut être établie."

En revanche, l'interprétation abstraite vise à explorer toutes les exécutions. Pour ce faire, il utilise plusieurs ingrédients, dont l'un est très similaire à l'idée principale de l'exécution symbolique. Ces ingrédients sont (1) des états abstraits, (2) la jonction et l'élargissement (d'où «réseau» dans le titre).

États abstraits.L'état concret d'un programme à un moment donné est essentiellement un instantané du contenu de la mémoire (y compris le code de programme lui-même et le compteur de programme). Cela a beaucoup de détails, ce qui est difficile à suivre. Lorsque vous analysez une propriété particulière, vous souhaiterez peut-être ignorer de grandes parties de l'état concret. Ou vous pouvez ne vous soucier que si une variable particulière est négative, nulle ou positive, mais ne vous souciez pas de sa valeur exacte. En général, vous voulez considérer une version abstraite de l'état concret. Pour que cela fonctionne, vous devez avoir une propriété de commutativité: si vous prenez un état concret, exécutez une instruction, puis extrayez l'état résultant, vous devez obtenir le même résultat que si vous abstrayez l'état initial, puis exécutez le même mais sur l'état abstrait. Ce diagramme de commutativité apparaît dans les deux articles. Telle est l'idée commune. Encore une fois, l'interprétation abstraite est plus générale, car elle ne dicte pas comment abstraire un état - elle dit simplement qu'il devrait y avoir un moyen de le faire. En revanche, l'exécution symbolique indique que vous utilisez des expressions (symboliques) qui mentionnent les valeurs initiales.

Rejoindre et élargir. Si l'exécution du programme atteint une certaine instruction de deux manières différentes, l'exécution symbolique n'essaye pas de fusionner les deux analyses. C'est pourquoi la citation ci-dessus parle d'arbres d'exécution, plutôt que de dags. Mais rappelez-vous que l'interprétation abstraite veut couvrir toutes les exécutions. Ainsi, il demande un moyen de fusionner les analyses de deux exécutions au point où elles ont le même compteur de programme. (La jointure pourraitêtre très stupide ({a} join {b} = {a, b}) de sorte que cela équivaut à ce que fait l'exécution symbolique.) En général, se joindre à lui-même n'est pas suffisant pour garantir que vous finirez par analyser toutes les exécutions. (En particulier, la jointure muette mentionnée précédemment ne fonctionnera pas.) Considérons un programme avec des boucles: "n = input (); pour i dans la plage (n): dostuff ()". Combien de fois devez-vous faire le tour de la boucle et continuer à vous joindre? Aucune réponse fixe ne fonctionne. Ainsi, quelque chose d'autre est nécessaire, et cela s'élargit , ce qui peut être vu comme une heuristique. Supposons que vous ayez fait le tour de la boucle 3 fois et que vous ayez appris que "i = 0 ou i = 1 ou i = 2". Ensuite, vous dites: hmmm, ... élargissons, et vous obtenez "i> = 0". Encore une fois, l'interprétation abstraite ne dit pas comment procéder à l'élargissement - elle indique simplement quelles propriétés l'élargissement devrait être déterminé.

(Désolé pour cette longue réponse: je n'ai vraiment pas eu le temps de la raccourcir.)


5

Je pense que cela signifie dans un sens très superficiel. La première étape de l'interprétation abstraite consiste à identifier une sémantique de collecte concrète. Plutôt que de décrire l'évolution d'un seul état, la collecte de sémantique décrit l'évolution d'ensembles d'états. Comme l'exécution symbolique raisonne sur les représentations des ensembles d'états, on peut argumenter qu'elle représente la sémantique concrète du programme. Je n'ai pas connaissance d'une correspondance plus précise en cours d'élaboration.


Je vous remercie. Mais si SE représente la sémantique concrète, alors quelle est la sémantique abstraite. Sans la sémantique abstraite, on ne peut pas dire que c'est un cas d'IA. Pourriez-vous expliquer un peu plus? Au fait, j'ai lu votre article, les solveurs SAT sont de l'IA, c'est vraiment intéressant.
qsp

3
Premièrement, l'abstraction est une notion réflexive, ce qui signifie que chaque structure est une abstraction triviale d'elle-même via la fonction d'identité. Deuxièmement, l'exécution symbolique ne calculera pas toute la sémantique concrète car seuls certains chemins de programme sont explorés, donc dans ce sens, il y a une abstraction sous-approximative.
Vijay D

2

Voir Patrick Cousot. Méthodes itératives de construction et d'approximation de points fixes d'opérateurs monotones sur un treillis, analyse sémantique des programmes (Méthodes itératives de construction et d'approximation des points fixes d'opérateurs monotones sur treillis, analyse statique de programme). Thèse ès Sciences Mathématiques, Université Joseph Fourier, Grenoble, France, 21 mars 1978. https://cs.nyu.edu/~pcousot/publications.www/CousotTheseEsSciences1978.pdf (malheureusement en français), page (3) -27 à (3) -29

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.