নিম্নলিখিত কোডটি জিসিসিতে একটি অসীম লুপে যায়:
#include <iostream>
using namespace std;
int main(){
int i = 0x10000000;
int c = 0;
do{
c++;
i += i;
cout << i << endl;
}while (i > 0);
cout << c << endl;
return 0;
}
সুতরাং এখানে চুক্তিটি রয়েছে: স্বাক্ষরযুক্ত পূর্ণসংখ্যার ওভারফ্লো প্রযুক্তিগতভাবে অপরিবর্তিত আচরণ। তবে x86-তে জিসিসি x86 পূর্ণসংখ্যার নির্দেশাবলী ব্যবহার করে পূর্ণসংখ্যার গাণিতিক প্রয়োগ করে - যা ওভারফ্লোতে মোড়ানো।
অতএব, আমি এটি অপরিশোধিত আচরণ সত্ত্বেও - এটি ওভারফ্লোতে আবৃত হওয়ার প্রত্যাশা করতাম। তবে এটি স্পষ্টভাবে কেস নয়। তাহলে আমি কী মিস করলাম?
আমি এটি ব্যবহার করে সংকলন করেছি:
~/Desktop$ g++ main.cpp -O2
জিসিসি আউটপুট:
~/Desktop$ ./a.out
536870912
1073741824
-2147483648
0
0
0
... (infinite loop)
অপ্টিমাইজেশান অক্ষম থাকায় কোনও অসীম লুপ নেই এবং আউটপুট সঠিক। ভিজ্যুয়াল স্টুডিওও এটি সঠিকভাবে সংকলন করে এবং নিম্নলিখিত ফলাফল দেয়:
সঠিক আউটপুট:
~/Desktop$ g++ main.cpp
~/Desktop$ ./a.out
536870912
1073741824
-2147483648
3
এখানে আরও কিছু ভিন্নতা রয়েছে:
i *= 2; // Also fails and goes into infinite loop.
i <<= 1; // This seems okay. It does not enter infinite loop.
এখানে সম্পর্কিত সমস্ত সংস্করণ তথ্য রয়েছে:
~/Desktop$ g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ..
...
Thread model: posix
gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4)
~/Desktop$
সুতরাং প্রশ্নটি হ'ল: এটি কি জিসিসিতে একটি বাগ? বা জিসিসি কীভাবে পূর্ণসংখ্যার গাণিতিক পরিচালনা করে সে সম্পর্কে আমি কিছু ভুল বুঝেছি?
* আমি এই সিটিকেও ট্যাগ করছি, কারণ আমি ধরে নিয়েছি যে এই বাগটি সি-এ পুনরুত্পাদন করবে (আমি এখনও এটি যাচাই করি নি))
সম্পাদনা করুন:
লুপের সমাবেশটি এখানে:
.L5:
addl %ebp, %ebp
movl $_ZSt4cout, %edi
movl %ebp, %esi
.cfi_offset 3, -40
call _ZNSolsEi
movq %rax, %rbx
movq (%rax), %rax
movq -24(%rax), %rax
movq 240(%rbx,%rax), %r13
testq %r13, %r13
je .L10
cmpb $0, 56(%r13)
je .L3
movzbl 67(%r13), %eax
.L4:
movsbl %al, %esi
movq %rbx, %rdi
addl $1, %r12d
call _ZNSo3putEc
movq %rax, %rdi
call _ZNSo5flushEv
cmpl $3, %r12d
jne .L5
gcc -S
।