


Mengapa Kod C Ini Menghasilkan Gelung Infinite pada GCC dengan Pengoptimuman Didayakan?
Dec 05, 2024 am 04:47 AMLimpahan Integer pada x86: Membongkar Teka-teki Gelung Infinite
Pertimbangkan coretan kod berikut yang secara misteri menjunam ke dalam gelung tak terhingga apabila disusun menggunakan GCC:
int i = 0x10000000; do { i += i; cout << i << endl; } while (i > 0);
Misteri Terbongkar
Walaupun limpahan integer lazimnya adalah gelagat yang tidak ditentukan, arahan aritmetik integer seni bina x86 lazimnya membungkus jika limpahan berlaku. Walau bagaimanapun, dalam kes ini, pengoptimuman GCC memperkenalkan anomali.
Misadventures Pengoptimuman
Dengan pengoptimuman didayakan, GCC menganggap limpahan integer adalah mustahil dan menghapuskan semakan keadaan keluar gelung. Akibatnya, apabila integer i dililitkan kepada nilai negatif, gelung itu berterusan tanpa henti.
Pengendalian Betul Visual Studio
Visual Studio, sebaliknya, mengendalikan limpahan integer dengan betul dan keluar dari gelung seperti yang dimaksudkan.
Menentukan Tidak Ditakrifkan Tingkah laku
Tingkah laku pelik ini menyerlahkan sifat tidak dapat diramalkan bagi tingkah laku yang tidak ditentukan. Walaupun pembalut integer dijangka pada x86, gelagat yang tidak ditentukan boleh nyata dalam cara yang tidak dijangka, mengecewakan ramalan pengkompil.
Penyelesaian
- Lumpuhkan pengoptimuman (-O0) untuk menguatkuasakan limpahan eksplisit semak.
- Gunakan bendera -fwrapv untuk mendayakan semantik limpahan yang jelas. Walau bagaimanapun, ambil perhatian tentang kemungkinan penalti prestasi.
Kesimpulan
Pilihan GCC untuk mengoptimumkan keadaan keluar gelung dengan kehadiran gelagat yang tidak ditentukan membawa kepada membingungkan gelung tak terhingga. Ini berfungsi sebagai peringatan tentang akibat yang tidak dapat diramalkan kerana melanggar peraturan tingkah laku yang tidak ditentukan, menuntut berhati-hati apabila bekerja dengan aritmetik integer pada platform x86.
Atas ialah kandungan terperinci Mengapa Kod C Ini Menghasilkan Gelung Infinite pada GCC dengan Pengoptimuman Didayakan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Artikel Panas

Alat panas Tag

Artikel Panas

Tag artikel panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Langkah Format Fungsi Fungsi C Langkah Penukaran Kes

Gulc: Perpustakaan C dibina dari awal

Apakah jenis nilai yang dikembalikan oleh fungsi bahasa C? Apa yang menentukan nilai pulangan?

Apakah definisi dan peraturan panggilan fungsi bahasa C dan apakah itu

Bagaimana Perpustakaan Templat St Standard (STL) berfungsi?

Di manakah nilai pulangan fungsi bahasa C yang disimpan dalam ingatan?

Penggunaan dan perkongsian frasa yang berbeza

Berapakah minimum biasa dari pembahagi umum maksimum fungsi bahasa C?
