Go: cmd/compile: testing/quick se comporta mal en Nexus 9 linux/arm64

Creado en 31 mar. 2017  ·  3Comentarios  ·  Fuente: golang/go

El selector int64 de testing/quick está escrito para devolver valores en el rango [-2⁶²,2⁶²).
Eso es un error; arreglando eso es # 19808.

Pero el código debería ejecutarse tal como está escrito y, sin embargo, en el Nexus 9 de @dr2chase
ejecutar una cadena de herramientas linux/arm64 creada a partir de una cadena de herramientas android/arm64
compilado de otra parte, empíricamente genera valores fuera
ese rango (Eso ayudó a encontrar #19807.)

Usando una cadena de herramientas linux/arm64 construida a partir de una cadena de herramientas linux/arm64
compilado de forma cruzada desde otro lugar en un Odroid funciona correctamente.

Antes de arreglar testing/quick para generar el rango completo, debemos calcular
averiguar por qué el código actual genera valores fuera del rango más estrecho
en esta configuración.

matemáticas/rand's (*Rand).Int63 dice:

return r.src.Int63()

y (*rngSource).Int63 dice:

return int64(rng.Uint64() & _MASK)

donde:

const (
    _MAX  = 1 << 63
    _MASK = _MAX - 1
)

y luego la función randInt64 de testing/quick hace lo siguiente:

return rand.Int63() - 1<<62

Entonces, el & _MASK o el - 1<<62 no están haciendo su trabajo.

Podría ser que el hardware Nexus 9 ARM64 tenga errores.
Podría ser que la cadena de herramientas android/arm64 se esté utilizando para
bootstrap en el Nexus 9 tiene errores, lo que provoca que la compilación nativa
La cadena de herramientas linux/arm64 tiene errores, lo que hace que la prueba/rápida
código para generar valores inesperados. no lo sabemos

FrozenDueToAge

Comentario más útil

El siguiente programa C se comporta mal en el sistema problemático.

#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;
}

Después de 20k-50k iteraciones, el ciclo comienza a imprimir i en cada iteración.

No es culpa de Go. Veremos si reportamos esto en otro lado.

Todos 3 comentarios

CL https://golang.org/cl/39152 menciona este problema.

El siguiente programa C se comporta mal en el sistema problemático.

#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;
}

Después de 20k-50k iteraciones, el ciclo comienza a imprimir i en cada iteración.

No es culpa de Go. Veremos si reportamos esto en otro lado.

CL https://golang.org/cl/39310 menciona este problema.

¿Fue útil esta página
0 / 5 - 0 calificaciones