Gelagat Tidak Ditakrifkan dalam Kompilasi C
Dalam kod yang diberikan, tingkah laku yang dijangkakan adalah untuk berulang melalui mc tatasusunan dari indeks 0 hingga 3 dan keluarkan nilai, menghasilkan urutan nombor "0, 1, 2, 3". Walau bagaimanapun, gelagat yang diperhatikan ialah gelung tidak berkesudahan yang menghasilkan siri tidak berkesudahan "0, 1, 2, 3, ....".
Punca isu terletak pada pernyataan tugasan delta = mc[ di]. Operasi ini cuba mengakses mc tatasusunan melebihi indeksnya yang sah, khususnya pada indeks 4 (di luar sempadan). Dalam C , akses sedemikian menimbulkan gelagat yang tidak ditentukan, membenarkan pengkompil berkelakuan dalam cara yang tidak dapat diramalkan.
Dalam kes ini, pengkompil dengan pengoptimuman didayakan (cth., menggunakan bendera -O2) menganggap bahawa tiada gelagat yang tidak ditentukan berlaku. Secara khusus, ia membuat kesimpulan bahawa di < 4 sentiasa benar, kerana mengakses mc[di] di luar sempadan sebaliknya tidak akan ditentukan.
Andaian ini membawa kepada pengoptimuman gelung yang agresif. Dalam kod yang dioptimumkan, di < 4 cek dikeluarkan, dan arahan lompat tanpa syarat ditambah. Ini secara berkesan menghapuskan keadaan penamatan gelung yang dimaksudkan dan menghasilkan gelung tanpa henti.
Mematikan pengoptimuman gelung agresif menggunakan bendera -fno-agressive-loop-optimizations menyebabkan pengkompil berkelakuan seperti yang diharapkan. Ia mengiktiraf potensi tingkah laku yang tidak ditentukan dan menghalang pengoptimuman yang bermasalah.
Adalah penting untuk ambil perhatian bahawa tingkah laku yang tidak ditentukan dalam C boleh mendatangkan akibat yang tidak dapat diramalkan dan berpotensi berbahaya. Adalah disyorkan untuk mengelak daripada bergantung pada tingkah laku yang tidak ditentukan dan menulis kod yang mematuhi spesifikasi bahasa.
Atas ialah kandungan terperinci Mengapa Gelung C Saya Berjalan Selama-lamanya Apabila Mengakses Susunan Di Luar Had?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!