19.06.2014 Views

Rim Chaabane. Analyse dynamique de ... - Université Paris 8

Rim Chaabane. Analyse dynamique de ... - Université Paris 8

Rim Chaabane. Analyse dynamique de ... - Université Paris 8

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Analyse</strong> <strong>dynamique</strong> <strong>de</strong> programmes C<br />

et 10 sont exécutées. L instruction 10 étant la fonction printf() qui affiche la valeur <strong>de</strong> la<br />

variable x, son résultat est affiché après son numéro <strong>de</strong> ligne. L instruction <strong>de</strong> la 11 ème ligne du<br />

co<strong>de</strong> source est exécutée, elle correspond à la fonction return 0, puis on retourne dans<br />

l environnement EiC ([::EiC::]) qui n a plus d instructions à exécuter d où la fin <strong>de</strong> son<br />

exécution.<br />

L option <strong>de</strong> trace originale à l interprète EiC ne nous fournit pas assez d informations quant à<br />

l exécution du programme, mis à part le numéro <strong>de</strong>s instructions exécutées. Nous allons alors<br />

explorer le co<strong>de</strong> source <strong>de</strong> EiC afin <strong>de</strong> savoir à quel endroit il y gère la fonction <strong>de</strong> trace, puis <strong>de</strong><br />

trouver comment la modifier afin qu elle nous renvoie les informations sur les dépendances entre<br />

données.<br />

Comme nous l avons vu dans le chapitre précé<strong>de</strong>nt, le co<strong>de</strong> source <strong>de</strong> EiC est contenu dans le<br />

dossier chemin_vers_EiC/src/ , le premier fichier appelé par le programme quand il est<br />

exécuté etant « main.c ». Ce fichier fait appel à la fonction EiC_startEiC() définie dans le<br />

fichier « starteic.c », qui fait appel à une autre fonction runEiC() pour initialiser l interprète EiC.<br />

Elle effectue ensuite les analyses lexicale et syntaxique avant d exécuter la fonction<br />

d interprétation EiC_interpret() qui, comme son nom l indique, effectue l interprétation <strong>de</strong>s<br />

instructions. Cette <strong>de</strong>rnière fonction est définie dans le fichier « interpre.c », qui contient également<br />

l option <strong>de</strong> trace d un programme vue en figure 19.<br />

En effet, en suivant l enchaînement <strong>de</strong>s appels entre fichiers sources EiC, nous trouvons que<br />

l option <strong>de</strong> trace consiste en une exécution d instructions dans EiC_interpret() si la variable<br />

EiC_traceON a pour valeur 1. Ainsi, lorsqu on fait appel à la comman<strong>de</strong> eic t fichier.c,<br />

la variable EiC_traceON est initialisée à 1 et la suite d instructions définies ci-<strong>de</strong>ssous est<br />

exécutée :<br />

if(EiC_traceON) {<br />

if(InSt[p].opco<strong>de</strong> == eiccall) {<br />

EiC_eicpush(&names,v);<br />

v.p.p = ((symentry_t *) STK[ToP - 1].v.p.p)->id;<br />

EiC_formatMessage("\n[%s] ",(char*)v.p.p);<br />

}<br />

if(!EiC_traceFunc && lastln != InSt[p].line && InSt[p].line) {<br />

lastln = InSt[p].line;<br />

EiC_formatMessage("%d,",lastln);<br />

}<br />

}<br />

Dans cet extrait <strong>de</strong> co<strong>de</strong> source, les résultats <strong>de</strong> trace obtenus sous EiC sont effectués avec les<br />

<strong>de</strong>ux instructions : EiC_formatMessage("\n[%s] ",(char*)v.p.p), pour le nom <strong>de</strong> la<br />

fonction exécutée et EiC_formatMessage("%d,",lastln) pour le numéro <strong>de</strong> la ligne<br />

d instruction exécutée (variable lastln). Nous nous sommes donc servis <strong>de</strong> ces fonctions pour<br />

y insérer nos propres informations, et nous avons aussi modifié leur format affichage en un<br />

format spécifique à notre base <strong>de</strong> données (cf. section 5.14). Les informations que nous avons<br />

ajoutées sont générées par la boucle d évaluation <strong>de</strong>s instructions, qui est également effectuée à<br />

l intérieur <strong>de</strong> la fonction EiC_interpret(). Cette boucle a pour rôle essentiel d exécuter le<br />

co<strong>de</strong>, qui à ce sta<strong>de</strong> se présente sous la forme <strong>de</strong> co<strong>de</strong> intermédiaire : opco<strong>de</strong> [operan<strong>de</strong>], où<br />

l opcope est un symbole désignant un type d instructions et operan<strong>de</strong> désigne l éventuel<br />

argument <strong>de</strong> l instruction. C est donc ce co<strong>de</strong> intermédiaire que nous exploitons pour obtenir <strong>de</strong>s<br />

informations telles que l affectation d une variable ou son utilisation par une instruction.<br />

Pour comprendre ce qu effectue la boucle d évaluation d instructions <strong>de</strong> la fonction<br />

EiC_interpret(), il faut savoir au préalable que EiC décompose une ligne d instruction C en<br />

plusieurs instructions <strong>de</strong> co<strong>de</strong> intermédiaire. Nous pouvons voir dans l exemple qui suit,<br />

47

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!