.NET 4 x86 জিটারে আপনি একটি কোড প্রজন্মের বাগ খুঁজে পেয়েছেন। এটি খুব অস্বাভাবিক একটি, কোডটি অনুকূলিত না হলে এটি ব্যর্থ হয়। মেশিন কোডটি এর মতো দেখাচ্ছে:
State a = s[0, 0];
013F04A9 push 0 ; index 2 = 0
013F04AB mov ecx,dword ptr [ebp-40h] ; s[] reference
013F04AE xor edx,edx ; index 1 = 0
013F04B0 call 013F0058 ; eax = s[0, 0]
013F04B5 mov dword ptr [ebp-4Ch],eax ; $temp1 = eax
013F04B8 movsx eax,byte ptr [ebp-4Ch] ; convert sbyte to int
013F04BC mov dword ptr [ebp-44h],eax ; a = s[0, 0]
Console.WriteLine(a == s[0, 0]); // False
013F04BF mov eax,dword ptr [ebp-44h] ; a
013F04C2 mov dword ptr [ebp-50h],eax ; $temp2 = a
013F04C5 push 0 ; index 2 = 0
013F04C7 mov ecx,dword ptr [ebp-40h] ; s[] reference
013F04CA xor edx,edx ; index 1 = 0
013F04CC call 013F0058 ; eax = s[0, 0]
013F04D1 mov dword ptr [ebp-54h],eax ; $temp3 = eax
; <=== Bug here!
013F04D4 mov eax,dword ptr [ebp-50h] ; a == s[0, 0]
013F04D7 cmp eax,dword ptr [ebp-54h]
013F04DA sete cl
013F04DD movzx ecx,cl
013F04E0 call 731C28F4
প্রচুর টেম্পোরারি এবং কোড ডুপ্লিকেশন সহ একটি প্লডডিং অ্যাফেয়ার, এটি অনিচ্ছাকৃত কোডের জন্য সাধারণ। 013F04B8 এ দেওয়া নির্দেশটি উল্লেখযোগ্য, সেখান থেকে এসবিটি থেকে 32-বিট পূর্ণসংখ্যায় রূপান্তর ঘটে। অ্যারে প্রাপ্তকারী সহায়তা ফাংশন 0x0000000FF, State.BUG এর সমান ফিরে এসেছিল এবং মানটির সাথে তুলনা করার আগে এটি -1 (0xFFFFFFF) এ রূপান্তর করা দরকার। MOVSX নির্দেশনা একটি সাইন এক্সটেনশন নির্দেশ।
013F04CC এ আবার একই ঘটনা ঘটে তবে এবার আর নেই এবার একই রূপান্তর করার জন্য এমওভিএসএক্স নির্দেশ । চিপসটি এখানেই পড়ে যায়, সিএমপি নির্দেশনা 0xF00FFFFF 0x000000FF এর সাথে তুলনা করে এবং এটি মিথ্যা। সুতরাং এটি বাদ দেওয়ার একটি ত্রুটি, কোড জেনারেটর একই স্কাইটি ইন্ট রূপান্তর করতে আবার এমওভিএসএক্স নির্গত করতে ব্যর্থ হয়েছিল।
এই বাগটি সম্পর্কে বিশেষত অস্বাভাবিক বিষয়টি হল আপনি যখন অপটিমাইজারটি সক্ষম করবেন তখন এটি সঠিকভাবে কাজ করে, এটি এখন উভয় ক্ষেত্রেই এমওভিএসএক্স ব্যবহার করতে জানে।
এই বাগটি এত দিন ধরে সনাক্ত করা যায় না এমন সম্ভাব্য কারণ হ'ল এনুমের বেস ধরণ হিসাবে এসবিটি ব্যবহার। বেশ বিরল। বহুমাত্রিক অ্যারে ব্যবহার করা যেমন উপকরণ তেমনি সংমিশ্রণটি মারাত্মক।
অন্যথায় আমি বলব একটি সুন্দর সমালোচনা বাগ। এটি কতটা বিস্তৃত হতে পারে তা অনুমান করা শক্ত, আমার কাছে কেবল পরীক্ষার জন্য 4.6.1 x86 জিটার রয়েছে। X64 এবং 3.5 x86 জিটারটি খুব আলাদা কোড উত্পন্ন করে এবং এই বাগটি এড়ায়। অস্থায়ী কর্মক্ষেত্রটি চালিয়ে যাওয়া হ'ল এনবাইজ বেস টাইপ হিসাবে এসবিট সরিয়ে এবং এটি ডিফল্ট, ইনট হিসাবে দেওয়া হোক , তাই কোন চিহ্ন এক্সটেনশন প্রয়োজন।
আপনি সংযোগ.মিক মাইক্রোসফট.কম এ বাগটি ফাইল করতে পারেন, এই প্রশ্ন + এটির সাথে লিঙ্ক করার জন্য তাদের যা জানা দরকার তা তাদের জানাতে যথেষ্ট হওয়া উচিত। আপনি সময় না নিতে চাইলে আমাকে জানান এবং আমি এটি যত্ন নেব।