Selon la JLS, un int
doit être rempli par des zéros juste après l'initialisation. Cependant, je suis confronté à une situation où ce n'est pas le cas. Ce comportement est apparu pour la première fois dans le JDK 7u4, puis dans toutes les mises à jour ultérieures (j'utilise une implémentation 64 bits). Le code suivant lance une exception :
public static void main(String[] args) {
int[] a;
int n = 0;
for (int i = 0; i < 100000000; ++i) {
a = new int[10];
for (int f : a)
if (f != 0)
throw new RuntimeException("Array just after allocation: "+ Arrays.toString(a));
Arrays.fill(a, 0);
for (int j = 0; j < a.length; ++j)
a[j] = (n - j)*i;
for (int f : a)
n += f;
}
System.out.println(n);
}
L'exception se produit après que la JVM a compilé le bloc de code et ne se produit pas avec la fonction -Xint
drapeau. En outre, le Arrays.fill(...)
(comme toutes les autres instructions de ce code) est nécessaire, et l'exception ne se produit pas si elle est absente. Il est clair que ce bogue possible est lié à une optimisation de la JVM. Une idée de la raison d'un tel comportement ?
Mise à jour :
Je constate ce comportement sur HotSpot 64-bit server VM, version Java de 1.7.0_04 à 1.7.0_10 sur Gentoo Linux, Debian Linux (les deux versions du noyau 3.0) et MacOS Lion. Cette erreur peut toujours être reproduite avec le code ci-dessus. Je n'ai pas testé ce problème avec un JDK 32 bits ou sous Windows. J'ai déjà envoyé un rapport de bug à Oracle (bug id 7196857) et il apparaîtra dans la base de données publique des bugs d'Oracle dans quelques jours.
Mise à jour :
Oracle a publié ce bogue dans sa base de données publique de bogues : http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7196857