der int64-Wahlschalter von testing/quick ist so geschrieben, dass er Werte im Bereich [-2⁶²,2⁶²) zurückgibt.
Das ist ein Fehler; das zu beheben ist #19808.
Aber der Code sollte wie geschrieben laufen, und zwar auf dem Nexus 9 von @dr2chase
Ausführen einer Linux/arm64-Toolchain, die aus einer Android/arm64-Toolchain erstellt wurde
von anderswo querkompiliert, generiert es empirisch Werte außerhalb
diese Reichweite. (Das hat geholfen, #19807 zu finden.)
Verwenden einer Linux/arm64-Toolchain, die aus einer Linux/arm64-Toolchain erstellt wurde
Querkompiliert von woanders auf einem Odroid funktioniert korrekt.
Bevor wir das Testen reparieren/schnell die gesamte Bandbreite generieren, sollten wir herausfinden
herauszufinden, warum der aktuelle Code Werte außerhalb des engeren Bereichs generiert
in dieser Konfiguration.
math/rand's (*Rand).Int63 sagt:
return r.src.Int63()
und (*rngSource).Int63 sagt:
return int64(rng.Uint64() & _MASK)
wo:
const (
_MAX = 1 << 63
_MASK = _MAX - 1
)
und dann die Funktion randInt64 von Testing/Quick:
return rand.Int63() - 1<<62
Also entweder das & _MASK
oder das - 1<<62
macht seine Arbeit nicht.
Es könnte sein, dass die Nexus 9 ARM64-Hardware fehlerhaft ist.
Es könnte sein, dass die Android/arm64-Toolchain verwendet wird
Bootstrap auf dem Nexus 9 ist fehlerhaft, was dazu führt, dass die nativ kompilierte
Linux/arm64-Toolchain ist fehlerhaft, was das Testen/Schnell verursacht
Code zum Generieren unerwarteter Werte. Wir wissen es nicht.
CL https://golang.org/cl/39152 erwähnt dieses Problem.
Das folgende C-Programm verhält sich auf dem problematischen System schlecht.
#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;
}
Nach 20k-50k Iterationen beginnt die Schleife bei jeder Iteration mit dem Drucken von i.
Nicht Gos Schuld. Wir werden sehen, ob wir dies an anderer Stelle melden.
CL https://golang.org/cl/39310 erwähnt dieses Problem.
Hilfreichster Kommentar
Das folgende C-Programm verhält sich auf dem problematischen System schlecht.
Nach 20k-50k Iterationen beginnt die Schleife bei jeder Iteration mit dem Drucken von i.
Nicht Gos Schuld. Wir werden sehen, ob wir dies an anderer Stelle melden.