Go: cmd/compile : test/défaillance rapide sur Nexus 9 linux/arm64

Créé le 31 mars 2017  ·  3Commentaires  ·  Source: golang/go

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.

FrozenDueToAge

Commentaire le plus utile

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.

Tous les 3 commentaires

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.

Cette page vous a été utile?
0 / 5 - 0 notes