6. Détection des écrasements mémoire#

JEVEUX alloue dynamiquement chaque zone mémoire associée aux segments de valeurs lors de la première requête. Les différents segments de valeurs associés aux objets sont encadrés par 4 entiers devant et 4 derrière. Ces entiers permettent de stocker l’état et le statut, l’identificateur et la classe ainsi qu’un décalage pour gérer les types de longueur supérieure à l’unité d’adressage.

L’écrasement des entiers situés autour du segment provoque la perte de l’identité de l’objet associé au segment de valeurs. Un tel écrasement est généralement détecté à l’occasion de l’écriture sur disque du contenu de l’objet et non au moment du débordement. Il se traduit par un des messages d’erreur suivants :

<S> <JJLIRS> <ECRASEMENT AMONT POSSIBLE ADRESSE> nnnn

Dans ce cas on a écrasé un des entiers situés devant le segment de valeurs.

<S> <JJLIRS> <ECRASEMENT AVAL POSSIBLE ADRESSE> nnnn

Dans ce cas on a écrasé un des entiers situés derrière le segment de valeurs.

Règle d’usage :

Le développeur dispose alors de la routine JXVERI pour instrumenter son code.

Cette routine vérifie l’intégrité des valeurs de part et d’autre du segment de valeurs et peut signaler le point de rupture. Elle détecte en plus une incursion hors de la zone mémoire licite. Il est possible de mettre en œuvre à moindre frais dans la commande DEBUT ou POURSUITE l’appel à ce sous-programme avant chaque commande, ce qui permet de déterminer quelle commande effectue l’écrasement. Le développeur pourra alors, en instrumentant les routines associées à la commande, procéder par dichotomie pour déterminer la routine ou les instructions erronées.

L’écrasement peut aussi être moins important et n’affecter qu’un mot devant ou derrière le segment de valeurs, c’est le cas lorsque l’on fait une erreur d’indice dans le tableau \(Z?\) . Le contenu de l’usage ou du statut du segment de valeur est alors affecté, cette information peut être obtenue en consultant le résultat des impressions de la répartition en mémoire par la routine JEIMPM.