Rumah > pembangunan bahagian belakang > C++ > Mengapa Limpahan Integer Bertanda pada x86 dengan GCC Menyebabkan Gelung Infinite?

Mengapa Limpahan Integer Bertanda pada x86 dengan GCC Menyebabkan Gelung Infinite?

DDD
Lepaskan: 2024-12-08 17:20:12
asal
642 orang telah melayarinya

Why Does Signed Integer Overflow on x86 with GCC Cause an Infinite Loop?

Limpahan Integer pada x86 dengan GCC Menyebabkan Gelung Infinite

Pengenalan
Dalam coretan kod berikut, integer limpahan pada x86 dengan GCC secara tidak dijangka membawa kepada gelung tak terhingga sebaliknya daripada gelagat pembalut yang dijangkakan:

int i = 0x10000000;
do {
  i += i;
} while (i > 0);
Salin selepas log masuk

Analisis
Aritmetik integer pada CPU x86 lazimnya mengikut gelagat pembalut bagi perwakilan pelengkap dua. Walau bagaimanapun, dalam kod yang dinyatakan di atas, limpahan integer yang ditandatangani menyebabkan atur cara memasuki gelung tak terhingga.

Isunya
Tingkah laku limpahan integer yang ditandatangani yang tidak ditentukan membolehkan hasil yang tidak dapat diramalkan pada x86 . GCC menganggap integer tidak akan melimpah dan mengoptimumkan ujian gelung. Akibatnya, gelung berterusan selama-lamanya.

Pemerhatian

  • Gelung tak terhingga berlaku hanya dengan pengoptimuman didayakan (-O2).
  • Melumpuhkan pengoptimuman (-O0) menghasilkan tingkah laku yang betul.
  • Variasi lain (i *= 2) juga gagal, manakala i <<= 1 berjaya.

Penjelasan
Apabila limpahan integer berlaku, bendera status CPU tidak dikemas kini. Pengkompil, dengan mengandaikan tiada limpahan, tidak menyemak bendera dan meneruskan dengan gelung, membawa kepada gelung tak terhingga.

Penyelesaian
Untuk memastikan gelagat pembalut yang diingini, pengkompil flag -fwrapv harus digunakan. Bendera ini mendayakan semantik limpahan integer yang jelas tetapi mungkin mempunyai implikasi prestasi.

Kesimpulan
Limpahan integer yang ditandatangani ialah gelagat yang tidak ditentukan dan boleh membawa kepada hasil yang tidak dapat diramalkan. Penyusun boleh mengoptimumkan berdasarkan andaian tiada limpahan, mengakibatkan tingkah laku yang tidak dijangka. Menggunakan -fwrapv boleh menguatkuasakan gelagat pembalut tetapi harus ditimbang dengan potensi kesan prestasi.

Atas ialah kandungan terperinci Mengapa Limpahan Integer Bertanda pada x86 dengan GCC Menyebabkan Gelung Infinite?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan