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
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.
Comentario más útil
El siguiente programa C se comporta mal en el sistema problemático.
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.