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);
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
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!