Le sélecteur int64 de testing/quick est écrit pour renvoyer des valeurs dans la plage [-2⁶²,2⁶²).
C'est une erreur; fixation qui est #19808.
Mais le code devrait s'exécuter tel qu'il est écrit, et pourtant sur le Nexus 9 de @dr2chase
exécuter une chaîne d'outils linux/arm64 construite à partir d'une chaîne d'outils android/arm64
croisé d'ailleurs, il génère empiriquement des valeurs extérieures
cette gamme. (Cela a aidé à trouver #19807.)
Utilisation d'une chaîne d'outils linux/arm64 construite à partir d'une chaîne d'outils linux/arm64
cross-compilé d'ailleurs sur un Odroid fonctionne correctement.
Avant de fixer testing/rapide pour générer la gamme complète, nous devrions comprendre
pourquoi le code actuel génère des valeurs en dehors de la plage plus étroite
dans cette configuration.
math/rand's (*Rand).Int63 dit :
return r.src.Int63()
et (*rngSource).Int63 indique :
return int64(rng.Uint64() & _MASK)
où:
const (
_MAX = 1 << 63
_MASK = _MAX - 1
)
puis la fonction randInt64 de testing/quick fait :
return rand.Int63() - 1<<62
Donc, soit le & _MASK
, soit le - 1<<62
ne fait pas son travail.
Il se peut que le matériel Nexus 9 ARM64 soit bogué.
Il se peut que la chaîne d'outils android/arm64 soit utilisée pour
bootstrap sur le Nexus 9 est bogué, ce qui provoque la compilation native
la chaîne d'outils linux / arm64 est boguée, ce qui provoque le test / rapide
code pour générer des valeurs inattendues. Nous ne savons pas.
CL https://golang.org/cl/39152 mentionne ce problème.
Le programme C suivant se comporte mal sur le système problématique.
#include <stdio.h>
typedef unsigned long long uvlong;
uvlong f() { return ~0ull; }
uvlong g() { return (f() << 1) >> 1; }
int main() {
for (int i = 0;; i++) {
if ((long long)g() < 0) {
printf("%d\n", i);
}
}
return 0;
}
Après 20 000 à 50 000 itérations, la boucle commence à imprimer i à chaque itération.
Pas la faute de Go. On verra pour le signaler ailleurs.
CL https://golang.org/cl/39310 mentionne ce problème.
Commentaire le plus utile
Le programme C suivant se comporte mal sur le système problématique.
Après 20 000 à 50 000 itérations, la boucle commence à imprimer i à chaque itération.
Pas la faute de Go. On verra pour le signaler ailleurs.