Go: cmd/kompilieren: Testen/schnelles Fehlverhalten auf Nexus 9 Linux/Arm64

Erstellt am 31. März 2017  ·  3Kommentare  ·  Quelle: golang/go

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.

FrozenDueToAge

Hilfreichster Kommentar

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.

Alle 3 Kommentare

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.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen