Première étape
Le vérificateur s'assure que le fichier de classe possède bien le format d'une
classe. De plus, la classe ne doit être ni tronquée, ni agrandie.
Deuxième étape
Cette étape consiste à analyser le format de la classe. Elle a pour rôle de :
- Vérifier que les classes final ne sont pas dérivées.
- Vérifier que chaque classe, exeptée la classe Object, possède
une classe mère.
- Vérifier que le tableau de données vérifie certaines contraintes.
Troisième étape
Cette phase est la plus complexe. Ici le code binaire est analysé en
contrôlant chaque instruction avant de l'exécuter. L'étape assure qu'à tout
moment de l'exé-cution du programme :
- Une pile a toujours la même taille et contient des objets de
même type.
- L'accès à un registre n'est possible que s'il est connu.
En outre, il doit contenir une valeur d'un type approprié.
- Les méthodes sont appelées avec des bons arguments.
- Les champs sont modifiés par des valeurs de types appropriés.
Quatrième étape
Cette étape effectue certains tests non réalisés dans la troisième étape pour des
raisons d'efficacité.
Les tests suivants sont effectués lors de la première utilisation de la classe.
- Est-ce que la définition de la classe a bien été chargée ?
- Est-ce que la classe qui est en train d'être exécutée a bien
référencé la nouvelle classe ?
Les tests suivants sont effectués lors de la première utilisation d'une méthode
ou de la première modification d'un champ.
- Est-ce que la méthode ou le champ existe ?
- Est-ce que la méthode ou le champ a la signature précédemment
indiquée ?
- Est-ce que la méthode qui est en train d'être exécutée a accès
à cette mé-thode ou à ce champ ?
Après la troisième étape, les instructions de bytecode sont remplacées par de
nouvelles instructions pour indiquer qu'elles ont été vérifiées. Bien sûr,
ces instructions alternatives ne doivent pas être présentes avant l'étape 3.
Olivier Lux
30-03-1999