Mengapa Limpahan Integer Menyebabkan Gelung Tak Terhingga dalam GCC pada x86?
Kod yang disediakan memasuki gelung tak terhingga pada GCC disebabkan oleh tingkah laku yang tidak ditentukan dengan limpahan integer yang ditandatangani. Walaupun arahan integer x86 biasanya dibalut pada limpahan, GCC mengoptimumkan ujian gelung dalam kes ini.
Butiran:
- Oleh kerana limpahan integer ialah gelagat yang tidak ditentukan, apa-apa sahaja boleh berlaku, termasuk tingkah laku luar biasa seperti tidak berpusing.
- GCC lazimnya melakukan pengoptimuman dengan mengandaikan gelagat yang ditakrifkan dengan baik, termasuk pengoptimuman ujian gelung.
- Walau bagaimanapun, gelagat tidak ditentukan yang disebabkan oleh limpahan mengganggu andaian ini.
- Kod yang dioptimumkan melangkau ujian gelung, menghasilkan infiniti gelung.
Penyelesaian:
- Untuk mendapatkan gelagat pembalut, gunakan bendera -fwrapv apabila menyusun dengan GCC, yang membolehkan semantik pembalut yang jelas untuk integer yang ditandatangani.
- Berhati-hati bahawa ini boleh memberi kesan kepada prestasi berbanding tanpa perlindungan tingkah laku yang dioptimumkan.
Atas ialah kandungan terperinci Mengapa Limpahan Integer Ditandatangani Membawa kepada Gelung Tak Terhingga dalam Pengoptimuman GCC x86?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!