Quand 1+1=3, on dit merci au cache de Java

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
final Class cache = Integer.class.getDeclaredClasses()[0];
final Field f = cache.getDeclaredField("cache");
f.setAccessible(true);
final Integer[] tab = (Integer[]) f.get(cache);

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
final int res = PAPA + MAMAN;

System.out.printf("%d", res); // affiche 3

Et voilà…

2 réflexions au sujet de « Quand 1+1=3, on dit merci au cache de Java »

Laisser un commentaire