testing/quick 的 int64 选择器被写入以返回 [-2⁶²,2⁶²) 范围内的值。
这是一个错误; 修复#19808。
但是代码应该按照编写的方式运行,但是在@dr2chase的 Nexus 9 上
运行从 android/arm64 工具链构建的 linux/arm64 工具链
从其他地方交叉编译,凭经验它会在外部产生价值
那个范围。 (这有助于找到#19807。)
使用从 linux/arm64 工具链构建的 linux/arm64 工具链
从 Odroid 上的其他地方交叉编译的工作正常。
在修复测试/快速生成完整范围之前,我们应该计算
找出当前代码生成较窄范围之外的值的原因
在这个配置中。
数学/兰德的 (*Rand).Int63 说:
return r.src.Int63()
和 (*rngSource).Int63 说:
return int64(rng.Uint64() & _MASK)
在哪里:
const (
_MAX = 1 << 63
_MASK = _MAX - 1
)
然后测试/快速的 randInt64 函数:
return rand.Int63() - 1<<62
因此, & _MASK
或- 1<<62
都没有发挥作用。
可能是 Nexus 9 ARM64 硬件有问题。
可能是 android/arm64 工具链用于
Nexus 9 上的引导程序有问题,导致本机编译
linux/arm64 工具链有问题,导致测试/快速
生成意外值的代码。 我们不知道。
CL https://golang.org/cl/39152提到了这个问题。
以下 C 程序在有问题的系统上行为不端。
#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;
}
在 20k-50k 次迭代后,循环开始在每次迭代时打印 i 。
不是 Go 的错。 我们将在其他地方看到有关报告的信息。
CL https://golang.org/cl/39310提到了这个问题。
最有用的评论
以下 C 程序在有问题的系统上行为不端。
在 20k-50k 次迭代后,循环开始在每次迭代时打印 i 。
不是 Go 的错。 我们将在其他地方看到有关报告的信息。