previous up next

Les pointeurs

Une des grandes différences entre le C++ et Java est l'absence explicite des pointeurs. En C et C++ l'accès aux adressages et l'arithmétique des pointeurs permettent un très grand nombre de violations que ne peut détecter le compilateur. Voici un exemple en C++ assez simple et tout à fait catastrophique : considérons d'abord la classe exemple :

class exemple
{
        private:
        char secret[9];
	
        ...
};
On peut ensuite écrire le programme suivant :
#include <stdio.h>
main()
{
        exemple *e;
        char *s;
        int ref;
	
        e = new exemple;
        ref = e;
        s = ref;
	
        printf("secret vaut : %s\n",s);
}
Ce programme passe à la compilation et donne bel et bien la valeur de secret ! On voit donc que grâce à l'accès aux adressages, la notion d'encapsulation du C++ est anéantie. Dans ce programme, on se contente d'afficher la valeur de la variable, mais on peut tout aussi bien en changer sa valeur. Il faut imaginer que l'on peut utiliser cette technique sur des classes systèmes. Les conséquences d'une attaque aussi simple pourraient être alors très graves.

L'accès aux adressages et l'arithmétique des pointeurs permettent de faire un peu ce que l'on veut en C/C++. Java supprime donc ces deux notions pour résoudre des problèmes de sécurité qui seraient autrement insurmontables. Ici toute référence à des instances ou à des méthodes se fait via des noms symboliques.

En Java toute création d'instance se fait implicitement à l'aide de pointeurs. On déclare tout d'abord une variable :

boite b;
Ensuite, on peut l'instantier à tout moment à l'aide de l'opérateur new.
b = new boite();
On dit que b référence la nouvelle instance. C'est lors de cette opération que la mémoire est dynamiquement allouée. La variable b a pour valeur la reférence de la zone mémoire, mais cette valeur n'est pas accessible. De plus, si un objet n'est plus référencé, celui-ci est pris en charge par le "ramasse-miette" qui se chargera de sa suppression. En effet, si plus aucune variable ne référence un objet, celui-ci devient en Java inaccessible.

Enfin les tableaux sont de véritables objets et peuvent être alloués dynamiquement. Ceux-ci permettent d'éviter l'arithmétique des pointeurs. On déclare tout d'abord la variable :

boite [] tableau;
On peut ensuite créer une instance du tableau.
tableau = new boite [20];


Olivier Lux
30-03-1999