Go: cmd / compile:Nexus 9 linux / arm64でのtesting / quickの誤動作

作成日 2017年03月31日  ·  3コメント  ·  ソース: golang/go

テスト/クイックのint64チューザーは、[-2⁶²、2⁶²)の範囲の値を返すように記述されています。
それは間違いです。 #19808である修正。

ただし、コードは記述どおりに実行する必要がありますが、 @ dr2chaseのNexus9でも実行できます。
android / arm64ツールチェーンから構築されたlinux / arm64ツールチェーンを実行する
他の場所からクロスコンパイルされ、経験的に外部の値を生成します
その範囲。 (それは#19807を見つけるのに役立ちました。)

linux / arm64ツールチェーンから構築されたlinux / arm64ツールチェーンを使用する
Odroidの他の場所からクロスコンパイルされたものは正しく機能します。

テスト/クイックを修正して全範囲を生成する前に、把握する必要があります
現在のコードがより狭い範囲外の値を生成する理由を説明します
この構成では。

math / rand's(* Rand).Int63によると:

return r.src.Int63()

および(* rngSource).Int63によると:

return int64(rng.Uint64() & _MASK)

どこ:

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

次に、testing / quickのrandInt64関数は次のことを行います。

return rand.Int63() - 1<<62

したがって、 & _MASKまたは- 1<<62のいずれかがその役割を果たしていません。

Nexus 9ARM64ハードウェアにバグがある可能性があります。
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の出力を開始します。

囲碁のせいではありません。 これについては他の場所で報告します。

全てのコメント3件

CLhttps //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の出力を開始します。

囲碁のせいではありません。 これについては他の場所で報告します。

CLhttps //golang.org/cl/39310はこの問題について言及しています。

このページは役に立ちましたか?
0 / 5 - 0 評価