Rumah pembangunan bahagian belakang C++ Mengapa Kod C Ini Menghasilkan Gelung Infinite pada GCC dengan Pengoptimuman Didayakan?

Mengapa Kod C Ini Menghasilkan Gelung Infinite pada GCC dengan Pengoptimuman Didayakan?

Dec 05, 2024 am 04:47 AM

Why Does This C   Code Produce an Infinite Loop on GCC with Optimizations Enabled?

Limpahan 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);
Salin selepas log masuk

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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Tag artikel panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Langkah Format Fungsi Fungsi C Langkah Penukaran Kes Langkah Format Fungsi Fungsi C Langkah Penukaran Kes Mar 03, 2025 pm 05:53 PM

Langkah Format Fungsi Fungsi C Langkah Penukaran Kes

Gulc: Perpustakaan C dibina dari awal Gulc: Perpustakaan C dibina dari awal Mar 03, 2025 pm 05:46 PM

Gulc: Perpustakaan C dibina dari awal

Apakah jenis nilai yang dikembalikan oleh fungsi bahasa C? Apa yang menentukan nilai pulangan? Apakah jenis nilai yang dikembalikan oleh fungsi bahasa C? Apa yang menentukan nilai pulangan? Mar 03, 2025 pm 05:52 PM

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 Apakah definisi dan peraturan panggilan fungsi bahasa C dan apakah itu Mar 03, 2025 pm 05:53 PM

Apakah definisi dan peraturan panggilan fungsi bahasa C dan apakah itu

Bagaimana Perpustakaan Templat St Standard (STL) berfungsi? Bagaimana Perpustakaan Templat St Standard (STL) berfungsi? Mar 12, 2025 pm 04:50 PM

Bagaimana Perpustakaan Templat St Standard (STL) berfungsi?

Di manakah nilai pulangan fungsi bahasa C yang disimpan dalam ingatan? Di manakah nilai pulangan fungsi bahasa C yang disimpan dalam ingatan? Mar 03, 2025 pm 05:51 PM

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

Penggunaan dan perkongsian frasa yang berbeza Penggunaan dan perkongsian frasa yang berbeza Mar 03, 2025 pm 05:51 PM

Penggunaan dan perkongsian frasa yang berbeza

Berapakah minimum biasa dari pembahagi umum maksimum fungsi bahasa C? Berapakah minimum biasa dari pembahagi umum maksimum fungsi bahasa C? Mar 03, 2025 pm 05:55 PM

Berapakah minimum biasa dari pembahagi umum maksimum fungsi bahasa C?

See all articles