Go: cmd / compile: الاختبار / سوء التصرف السريع على Nexus 9 linux / arm64

تم إنشاؤها على ٣١ مارس ٢٠١٧  ·  3تعليقات  ·  مصدر: golang/go

تم كتابة محدد int64 للاختبار / سريع لإرجاع القيم في النطاق [-2⁶²، 2⁶²).
هذا خطأ. تحديد هذا هو # 19808.

ولكن يجب تشغيل الكود كما هو مكتوب ، ومع ذلك على جهاز Nexus 9 الخاص بـ @ dr2chase
تشغيل سلسلة أدوات linux / arm64 التي تم إنشاؤها من android / arm64 toolchain
تم تجميعها من مكان آخر ، وتولد قيمًا من الخارج بشكل تجريبي
هذا النطاق. (ساعد ذلك في العثور على رقم 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
)

ثم اختبار / وظيفة randInt64 السريعة تفعل:

return rand.Int63() - 1<<62

لذلك إما أن & _MASK أو - 1<<62 لا يقوم بعمله.

يمكن أن يكون جهاز Nexus 9 ARM64 عربات التي تجرها الدواب.
يمكن أن تكون سلسلة أدوات android / arm64 المستخدمة من أجل
bootstrap على Nexus 9 عربات التي تجرها الدواب ، مما تسبب في تجميع ملفات
سلسلة أدوات لينكس / 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;
}

بعد التكرارات من 20 إلى 50 ألفًا ، تبدأ الحلقة في الطباعة على كل تكرار.

خطأ لا تذهب. سنرى حول الإبلاغ عن هذا في مكان آخر.

ال 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;
}

بعد التكرارات من 20 إلى 50 ألفًا ، تبدأ الحلقة في الطباعة على كل تكرار.

خطأ لا تذهب. سنرى حول الإبلاغ عن هذا في مكان آخر.

يذكر CL https://golang.org/cl/39310 هذه المشكلة.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات