Débordement d’indice d’un tableau à une dimension
121
expression ne faisant intervenir que des constantes et des constantes symboliques et qui
s’avère calculable par le traducteur.
Remarque
Comme nous le verrons au paragraphe 11, page 128, il existe des langages dans lesquels la
taille d’un tableau peut n’être définie qu’au moment de l’exécution. Dans ce cas, les contraintes évoquées ici n’existent plus.
Exercice 7.6 Réécrire le programme de tri du paragraphe précédent, de manière à ce que le
nombre d’éléments du tableau soit défini par une constante symbolique, comme expliqué
dans le présent paragraphe.
7 Débordement d’indice d’un tableau
à une dimension
Supposons que nous ayons déclaré :
tableau entier t [15]
Que va-t-il se passer si nous cherchons à utiliser la valeur de t[20] ou, pire, à la modifier ?
A priori, on peut penser que le traducteur du programme doit être en mesure de détecter cette
erreur puisqu’il dispose bien de l’information nécessaire (il lui suffirait de comparer 20 et
15 !). En pratique, cette erreur ne sera pas détectée dans tous les langages, notamment dans
les langages compilés.
Quoi qu’il en soit, un problème analogue va se poser si l’on cherche à utiliser ou à modifier la
valeur de t[i] avec une valeur de i incorrecte (c’est-à-dire négative, nulle ou supérieure à
15). Et là, on voit bien que la vérification ne peut pas être effectuée lors de la compilation 1 ,
puisque la véritable valeur de i (ou les véritables valeurs de i, puisque, après tout, cette instruction peut très bien être exécutée plusieurs fois) ne sera connue que lors de l’exécution.
Dans ces conditions, la seule chose que pourrait faire le compilateur serait d’ajouter des instructions supplémentaires qui, au moment de l’exécution, effectueraient les vérifications voulues. Là encore, ceci n’est pas mis en œuvre dans tous les langages (parfois pour des
questions d’efficacité).
Les conséquences d’une telle maladresse peuvent être plus ou moins importantes, par
exemple :
• valeur de t[i] imprévisible, dans le cas où l’on cherche simplement à utiliser cette valeur,
• écrasement d’un emplacement quelconque de la mémoire lorsque l’on cherche à affecter
une valeur à t[i].
1. En revanche, elle est plus facile à mettre en œuvre dans les langages interprétés.
121
expression ne faisant intervenir que des constantes et des constantes symboliques et qui
s’avère calculable par le traducteur.
Remarque
Comme nous le verrons au paragraphe 11, page 128, il existe des langages dans lesquels la
taille d’un tableau peut n’être définie qu’au moment de l’exécution. Dans ce cas, les contraintes évoquées ici n’existent plus.
Exercice 7.6 Réécrire le programme de tri du paragraphe précédent, de manière à ce que le
nombre d’éléments du tableau soit défini par une constante symbolique, comme expliqué
dans le présent paragraphe.
7 Débordement d’indice d’un tableau
à une dimension
Supposons que nous ayons déclaré :
tableau entier t [15]
Que va-t-il se passer si nous cherchons à utiliser la valeur de t[20] ou, pire, à la modifier ?
A priori, on peut penser que le traducteur du programme doit être en mesure de détecter cette
erreur puisqu’il dispose bien de l’information nécessaire (il lui suffirait de comparer 20 et
15 !). En pratique, cette erreur ne sera pas détectée dans tous les langages, notamment dans
les langages compilés.
Quoi qu’il en soit, un problème analogue va se poser si l’on cherche à utiliser ou à modifier la
valeur de t[i] avec une valeur de i incorrecte (c’est-à-dire négative, nulle ou supérieure à
15). Et là, on voit bien que la vérification ne peut pas être effectuée lors de la compilation 1 ,
puisque la véritable valeur de i (ou les véritables valeurs de i, puisque, après tout, cette instruction peut très bien être exécutée plusieurs fois) ne sera connue que lors de l’exécution.
Dans ces conditions, la seule chose que pourrait faire le compilateur serait d’ajouter des instructions supplémentaires qui, au moment de l’exécution, effectueraient les vérifications voulues. Là encore, ceci n’est pas mis en œuvre dans tous les langages (parfois pour des
questions d’efficacité).
Les conséquences d’une telle maladresse peuvent être plus ou moins importantes, par
exemple :
• valeur de t[i] imprévisible, dans le cas où l’on cherche simplement à utiliser cette valeur,
• écrasement d’un emplacement quelconque de la mémoire lorsque l’on cherche à affecter
une valeur à t[i].
1. En revanche, elle est plus facile à mettre en œuvre dans les langages interprétés.
