Go: cmd/compile:在 Nexus 9 linux/arm64 上测试/快速异常行为

创建于 2017-03-31  ·  3评论  ·  资料来源: golang/go

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 工具链有问题,导致测试/快速
生成意外值的代码。 我们不知道。

FrozenDueToAge

最有用的评论

以下 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 的错。 我们将在其他地方看到有关报告的信息。

所有3条评论

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提到了这个问题。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

longzhizhi picture longzhizhi  ·  3评论

ianlancetaylor picture ianlancetaylor  ·  3评论

enoodle picture enoodle  ·  3评论

mingrammer picture mingrammer  ·  3评论

stub42 picture stub42  ·  3评论