Ada banyak wajah berbeda dari Perilaku Tidak Terdefinisi, dan apa yang dapat diterima tergantung pada penggunaan.
loop dalam yang ketat yang menghabiskan sebagian besar waktu CPU total dalam aplikasi grafis real-time
Itu, dengan sendirinya, adalah sedikit hal yang tidak biasa, tetapi karena itu mungkin ... jika memang demikian, maka UB kemungkinan besar berada di ranah "diizinkan, dapat diterima" . Pemrograman grafik terkenal karena peretasan dan hal-hal buruk. Selama "bekerja" dan tidak butuh lebih dari 16,6 ms untuk menghasilkan bingkai, biasanya, tidak ada yang peduli. Namun tetap, waspadai apa artinya memohon UB.
Pertama, ada standarnya. Dari sudut pandang itu, tidak ada yang perlu didiskusikan dan tidak ada cara untuk membenarkan, kode Anda tidak valid. Tidak ada jika atau ketika itu, itu bukan kode yang valid. Anda mungkin juga mengatakan bahwa jari tengah dari sudut pandang Anda, dan 95-99% dari waktu Anda akan baik untuk tetap pergi.
Selanjutnya, ada sisi perangkat kerasnya. Ada beberapa arsitektur aneh dan tidak biasa di mana ini menjadi masalah. Saya mengatakan "tidak biasa, aneh" karena pada satu arsitektur yang membentuk 80% dari semua komputer (atau dua arsitektur yang bersama-sama membentuk 95% dari semua komputer) melimpah adalah "ya, apa pun, tidak peduli" hal di tingkat perangkat keras. Anda yakin mendapatkan hasil sampah (meskipun masih dapat diprediksi), tetapi tidak ada hal-hal jahat terjadi.
Itu tidakkasus pada setiap arsitektur, Anda mungkin mendapatkan jebakan overflow (meskipun melihat bagaimana Anda berbicara tentang aplikasi grafis, kemungkinan berada pada arsitektur yang aneh agak kecil). Apakah portabilitas masalah? Jika ya, Anda mungkin ingin abstain.
Terakhir, ada sisi kompiler / pengoptimal. Salah satu alasan mengapa overflow tidak terdefinisi adalah hanya membiarkannya pada saat yang paling mudah untuk mengatasi perangkat keras sekali waktu. Tapi alasan lain adalah bahwa misalnya x+1
adalah dijamin untuk selalu lebih besar dari x
, dan compiler / optimizer dapat memanfaatkan pengetahuan ini. Sekarang, untuk kasus yang disebutkan sebelumnya, kompiler memang dikenal untuk bertindak seperti ini dan hanya menghapus blok lengkap (ada ada exploit Linux beberapa tahun yang lalu yang didasarkan pada kompiler yang telah mati-henti menanggalkan beberapa kode validasi karena hal ini).
Untuk kasus Anda, saya akan sangat ragu bahwa kompiler melakukan beberapa optimasi khusus, aneh. Namun, apa yang Anda ketahui, apa yang saya tahu. Jika ragu, cobalah. Jika berhasil, Anda baik untuk pergi.
(Dan akhirnya, tentu saja ada audit kode, Anda mungkin harus membuang waktu untuk membahas hal ini dengan auditor jika Anda kurang beruntung.)