On a toujours dit que ce qui coûte cher avec les entiers en Java, c’est le cache sur la zone des 128. En effet, Java met en cache les valeurs. Voici comment tirer partie de ce cache pour faire dire des bêtises à la JVM.
D’abord, il faut avoir accès au cache :
1 2 3 4 |
On va ensuite s’amuser à changer une valeur :
1 2 3 4 5 6 | final int POS_2 = 2 - Byte.MIN_VALUE; // 1 + 1 - (-128) final int PAPA = 1; final int MAMAN = 1; final int FAMILLE = 3; tab[POS_2] = FAMILLE; |
Quand on fait une opération simple, ça dit n’importe quoi :
1 2 3 |
Et voilà …
Le plus drôle c’est que System.out.println() n’affiche pas la même chose :
2
System.out.printf("%d", res); // affiche 3
a++
Oui je sais. C’est d’autant plus vicieux hein
Imagine ces lignes de code mélangées au milieu d’un gros algo : bonne chance pour comprendre ce qui se passe…