জাভা: ইন অ্যারে ননজারো উপাদানগুলির সাথে সূচনা করে


130

জেএলএস অনুসারে, intশুরুর ঠিক পরে একটি অ্যারে জিরো দ্বারা পূরণ করা উচিত। যাইহোক, আমি এমন পরিস্থিতির মুখোমুখি হয়েছি যেখানে এটি নেই। এই জাতীয় আচরণটি প্রথমে জেডিকে 7u4 এ ঘটে এবং পরবর্তী সমস্ত আপডেটেও ঘটে (আমি 64-বিট বাস্তবায়ন ব্যবহার করি)। নিম্নলিখিত কোড ব্যতিক্রম ছুঁড়েছে:

public static void main(String[] args) {
        int[] a;
        int n = 0;
        for (int i = 0; i < 100000000; ++i) {
            a = new int[10];
            for (int f : a)
                if (f != 0)
                  throw new RuntimeException("Array just after allocation: "+ Arrays.toString(a));
            Arrays.fill(a, 0);
            for (int j = 0; j < a.length; ++j)
                a[j] = (n - j)*i;
            for (int f : a)
                n += f;
        }
        System.out.println(n);
    }

JVM কোড ব্লকের সংকলন সম্পাদন করে এবং -Xintপতাকা নিয়ে উত্থাপিত না হওয়ার পরে ব্যতিক্রম ঘটে । অতিরিক্তভাবে, Arrays.fill(...)বিবৃতিটি (এই কোডের অন্যান্য বিবৃতি হিসাবে) প্রয়োজনীয়, এবং এটি অনুপস্থিত থাকলে ব্যতিক্রম ঘটে না। এটি পরিষ্কার যে এই সম্ভাব্য বাগটি কিছু জেভিএম অপ্টিমাইজেশানের সাথে আবদ্ধ। এই জাতীয় আচরণের কারণে কোনও ধারণা?

হালনাগাদ:
আমি হটস্পট 64৪-বিট সার্ভার ভিএম, জাভা সংস্করণটি 1.7.0_04 থেকে জেন্টু লিনাক্স, দেবিয়ান লিনাক্স (উভয় কার্নেল 3.0 সংস্করণ) এবং ম্যাকোস লায়নতে জাভা সংস্করণটিতে দেখছি see এই ত্রুটিটি সর্বদা উপরের কোড সহ পুনরুত্পাদন করা যেতে পারে। আমি 32-বিট জেডিকে বা উইন্ডোজে এই সমস্যাটি পরীক্ষা করিনি। আমি ইতিমধ্যে ওরাকলকে একটি বাগ প্রতিবেদন পাঠিয়েছি (বাগ আইডি 7196857) এবং এটি কয়েক দিনের মধ্যে পাবলিক ওরাকল বাগ ডাটাবেসে উপস্থিত হবে।

আপডেট:
ওরাকল এই ত্রুটিটি তাদের সর্বজনীন বাগ ডাটাবেসে প্রকাশ করেছে: http://bugs.sun.com/bugdatedia/view_bug.do?bug_id=7196857


15
আমি যদি
অনুমানটি

12
যেহেতু আপনার একটি সংজ্ঞায়িত উদাহরণ রয়েছে যা নির্ভরযোগ্যভাবে সমস্যাটি পুনরায় উত্পাদন করে (কমপক্ষে কিছু প্ল্যাটফর্মের উপর), আপনি কি কোনও বাগ ফাইল করার বিষয়টি বিবেচনা করেছেন ?
জোচিম সৌর

4
হ্যাঁ, আপনার অবশ্যই অবশ্যই একটি বাগ রিপোর্ট ফাইল করা উচিত। এটি একটি খুব গুরুতর বাগ!
হট লিক্স

7
হ্যাঁ, আমি ইতিমধ্যে ওরাকলকে একটি বাগ রিপোর্ট পাঠিয়েছি (বাগ আইডি 7196857) এবং এটি কয়েক দিনের মধ্যেই পাবলিক ওরাকল বাগ ডাটাবেসে উপস্থিত হবে।
স্টানিস্লাভ পোস্টলাভস্কি

6
আমি এটি জাভা 7 আপডেট উইন্ডোতে 7 7৪-বিট দিয়ে চেষ্টা করেছি এবং এতে কোনও সমস্যা হয়নি।
পিটার লরি

উত্তর:


42

এখানে আমরা জেআইটি-সংকলকটিতে একটি বাগের মুখোমুখি হই। সংকলক নির্ধারণ করে যে বরাদ্দকৃত অ্যারেটি বরাদ্দ দেওয়ার পরে পূরণ করা হয়Arrays.fill(...) , তবে বরাদ্দ এবং পূরণের মধ্যে ব্যবহারের জন্য চেকটি ত্রুটিযুক্ত। সুতরাং, সংকলক একটি অবৈধ অপ্টিমাইজেশন সম্পাদন করে - এটি বরাদ্দ করা অ্যারের শূন্যস্থান এড়ায়।

এই বাগটি ওরাকল বাগ ট্র্যাকারে রাখা হয়েছে ( বাগ আইডি 7196857) ) । দুর্ভাগ্যক্রমে, আমি নিম্নলিখিত বিষয়গুলি সম্পর্কে ওরাকল থেকে কোনও ব্যাখ্যা পাওয়ার জন্য অপেক্ষা করি নি। আমি দেখতে পাচ্ছি, এই বাগটি ওএস-নির্দিষ্ট: এটি 64৪-বিট লিনাক্স এবং ম্যাকের জন্য একেবারেই পুনরুত্পাদনযোগ্য, তবে আমি মন্তব্য থেকে দেখতে পাচ্ছি, এটি উইন্ডোজ (জেডিকে অনুরূপ সংস্করণের জন্য) নিয়মিত পুনরুত্পাদন করে না। অতিরিক্তভাবে এই বাগটি কখন ঠিক করা হবে তা জেনে ভাল লাগবে।

এই মুহুর্তে কেবলমাত্র পরামর্শ রয়েছে: আপনি সদ্য ঘোষিত অ্যারেগুলির জন্য জেডিএসের উপর নির্ভর করে যদি JDK1.7.0.04 বা তার পরে ব্যবহার করবেন না।

5 অক্টোবর আপডেট:

০৪ অক্টোবর, ২০১২ এ প্রকাশিত জেডিকে 7u10 (প্রাথমিক অ্যাক্সেস) এর নতুন বিল্ড 10 -এ, এই বাগটি কমপক্ষে লিনাক্স ওএসের জন্য স্থির করা হয়েছিল (আমি অন্যের জন্য পরীক্ষা করিনি)। @ মাকোটোকে ধন্যবাদ, যিনি খুঁজে পেয়েছেন যে এই বাগটি আরাকল বাগ ডাটাবেসে সর্বজনীন অ্যাক্সেসের জন্য উপলব্ধ নেই। দুর্ভাগ্যক্রমে, ওরাকল এটিকে জনসাধারণের অ্যাক্সেস থেকে সরানোর কারণে আমি জানি না, তবে এটি গুগল ক্যাশে উপলব্ধ । এছাড়াও, এই বাগটি রেডহাতের দৃষ্টি আকর্ষণ করেছে: সিভিই সনাক্তকারীরা সিভিই -২২-২৪২০২০ ( বাগজিলা ) এবং সিভিই -২২-২৪৪1616 ( বাগজিলা ) এই ত্রুটির জন্য নির্ধারিত হয়েছিল।


2
বাগ আইডি এখন অবৈধ - আপনি কি এটি দেখতে পারেন?
মাকোটো

1
@ মাকোটো আমি বিভ্রান্ত, যেহেতু এই বাগটি গতকাল বাগের ডাটাবেজে ছিল। ওরাকল জনসাধারণের অ্যাক্সেস থেকে এই বাগটি সরিয়ে দেওয়ার কারণে আমি জানি না। তবে গুগলের কথা মনে আছে webcache.googleusercontent.com/... উপরন্তু এই বাগ এছাড়াও যেহেতু এটি একটি জন্য CVE হতে পারে, তাহলে RedHat বাগ ডাটাবেসের মধ্যে স্থাপন করা হয় bugzilla.redhat.com/show_bug.cgi?id=856124
স্তানিস্লাভ Poslavsky

0

আমি আপনার কোডে কিছু পরিবর্তন করেছি। এটি পূর্ণসংখ্যার অতিরিক্ত প্রবাহের সমস্যা নয়। কোডটি দেখুন, এটি রানটাইমের সময় একটি ব্যতিক্রম ছুঁড়ে

    int[] a;
    int n = 0;
    for (int i = 0; i < 100000000; ++i) {
        a = new int[10];
        for (int f : a) {
            if (f != 0) {
                throw new RuntimeException("Array just after allocation: " + Arrays.toString(a));
            }
        }
        for (int ii = 0, len = a.length; ii < len; ii++)
            a[ii] = 0;
        for (int j = 0; j < a.length; ++j)
            a[j] = Integer.MAX_VALUE - 1;
        for (int j = 0; j < a.length; ++j)
            n++;
    }

উইন্ডোজ 7 64 বিট। Jdk 64 বিট 1.7.0_07
রবার্তো মেরেগেটি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.