Go: cmd/kompilasi: pengujian/kesalahan cepat pada Nexus 9 linux/arm64

Dibuat pada 31 Mar 2017  ·  3Komentar  ·  Sumber: golang/go

pengujian/pemilih int64 cepat ditulis untuk mengembalikan nilai dalam kisaran [-2⁶²,2⁶²).
Itu kesalahan; memperbaikinya adalah #19808.

Tetapi kode harus berjalan seperti yang tertulis, namun pada Nexus 9 @ dr2chase
menjalankan toolchain linux/arm64 yang dibuat dari toolchain android/arm64
dikompilasi silang dari tempat lain, secara empiris menghasilkan nilai di luar
kisaran itu. (Itu membantu menemukan #19807.)

Menggunakan toolchain linux/arm64 yang dibuat dari toolchain linux/arm64
dikompilasi silang dari tempat lain di Odroid berfungsi dengan benar.

Sebelum memperbaiki pengujian/cepat untuk menghasilkan rentang penuh, kita harus mencari
tahu mengapa kode saat ini menghasilkan nilai di luar rentang yang lebih sempit
dalam konfigurasi ini.

matematika/rand (*Rand).Int63 mengatakan:

return r.src.Int63()

dan (*rngSource).Int63 mengatakan:

return int64(rng.Uint64() & _MASK)

di mana:

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

dan kemudian menguji/fungsi randInt64 cepat melakukan:

return rand.Int63() - 1<<62

Jadi & _MASK atau - 1<<62 tidak melakukan tugasnya.

Bisa jadi hardware Nexus 9 ARM64 bermasalah.
Bisa jadi toolchain android/arm64 digunakan untuk
bootstrap pada Nexus 9 bermasalah, menyebabkan kompilasi asli
linux/arm64 toolchain menjadi buggy, menyebabkan pengujian/cepat
kode untuk menghasilkan nilai yang tidak terduga. Kami tidak tahu.

FrozenDueToAge

Komentar yang paling membantu

Program C berikut melakukan kesalahan pada sistem yang bermasalah.

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

Setelah iterasi 20k-50k, loop mulai mencetak i pada setiap iterasi.

Bukan salah Go. Kita akan melihat tentang pelaporan ini di tempat lain.

Semua 3 komentar

CL https://golang.org/cl/39152 menyebutkan masalah ini.

Program C berikut melakukan kesalahan pada sistem yang bermasalah.

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

Setelah iterasi 20k-50k, loop mulai mencetak i pada setiap iterasi.

Bukan salah Go. Kita akan melihat tentang pelaporan ini di tempat lain.

CL https://golang.org/cl/39310 menyebutkan masalah ini.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat