Saya pernah melihat istilah "IB" dan "UB" digunakan beberapa kali, terutama dalam konteks C ++. Saya sudah mencoba mencari di Google, tetapi tampaknya kombinasi dua huruf itu banyak digunakan. : P
Jadi, saya bertanya kepada Anda ... apa artinya, ketika dikatakan seolah-olah itu hal yang buruk?
c++
terminology
definition
cHao
sumber
sumber
Jawaban:
IB: Perilaku yang Ditentukan Penerapan. Standar menyerahkannya pada kompilator / platform tertentu untuk mendefinisikan perilaku yang tepat, tetapi mengharuskannya untuk didefinisikan.
Menggunakan perilaku yang ditentukan implementasi bisa berguna, tetapi membuat kode Anda kurang portabel.
UB: Perilaku Tidak Terdefinisi. Standar tidak menentukan bagaimana program yang menjalankan perilaku tidak terdefinisi harus berperilaku. Juga dikenal sebagai "setan hidung" karena secara teoritis bisa membuat setan terbang keluar dari hidung Anda.
Menggunakan perilaku tidak terdefinisi hampir selalu merupakan ide yang buruk. Meskipun terkadang berfungsi, perubahan apa pun pada lingkungan, kompiler, atau platform dapat merusak kode Anda secara acak.
sumber
Perilaku yang ditentukan implementasi dan perilaku yang tidak ditentukan
Standar C ++ sangat spesifik tentang efek berbagai konstruksi, dan khususnya Anda harus selalu waspada terhadap kategori masalah berikut :
Perilaku tidak terdefinisi berarti sama sekali tidak ada jaminan yang diberikan. Kode bisa bekerja, atau bisa juga membakar hard drive Anda atau membuat setan terbang keluar hidung Anda . Sejauh menyangkut bahasa C ++, apa pun mungkin terjadi. Secara praktis, ini berarti Anda memiliki bug yang tidak dapat diperbaiki. Jika ini terjadi, Anda tidak dapat mempercayai apa pun tentang aplikasi Anda (karena salah satu efek dari perilaku tidak terdefinisi ini mungkin saja mengacaukan memori yang digunakan oleh aplikasi Anda lainnya). Tidak perlu konsisten, jadi menjalankan program dua kali mungkin memberikan hasil yang berbeda. Ini mungkin tergantung pada fase bulan, warna kemeja yang Anda kenakan, atau hal lainnya.
Perilaku tidak ditentukan berarti bahwa program harus melakukan sesuatu yang waras dan konsisten, tetapi tidak diwajibkan untuk mendokumentasikannya .
Perilaku yang ditentukan implementasi mirip dengan yang tidak ditentukan, tetapi juga harus didokumentasikan oleh penulis kompilator. Contoh dari ini adalah hasil dari a
reinterpret_cast
. biasanya , ini hanya mengubah jenis penunjuk, tanpa mengubah alamat, tetapi pemetaan sebenarnya ditentukan oleh implementasi, sehingga kompiler dapat memetakan ke alamat yang sama sekali berbeda, selama ia mendokumentasikan pilihan ini. Contoh lainnya adalah ukuran sebuah int. Standar C ++ tidak peduli apakah itu 2, 4 atau 8 byte, tetapi harus didokumentasikan oleh kompilatorTetapi yang umum untuk semua ini adalah mereka sebaiknya dihindari. Jika memungkinkan, pertahankan perilaku yang 100% ditentukan oleh standar C ++ itu sendiri. Dengan begitu, Anda dijamin mudah dibawa.
Anda juga sering harus mengandalkan beberapa perilaku yang ditentukan implementasi. Ini mungkin tidak dapat dihindari, tetapi Anda harus tetap memperhatikannya, dan berhati-hatilah karena Anda mengandalkan sesuatu yang dapat berubah di antara kompiler yang berbeda.
Sebaliknya, perilaku tidak terdefinisi harus selalu dihindari. Secara umum, Anda harus berasumsi bahwa itu membuat program Anda meledak dengan satu atau lain cara.
sumber
IB: adalah implementasi perilaku yang ditentukan - kompilator harus mendokumentasikan apa yang dilakukannya. Melakukan
>>
operasi pada nilai negatif adalah contohnya.UB: perilaku tidak terdefinisi - kompilator dapat melakukan apa pun, termasuk hanya menabrak atau memberikan hasil yang tidak dapat diprediksi. Dereferensi pointer nol termasuk dalam kategori ini, tetapi juga hal-hal yang lebih halus seperti aritmatika pointer yang berada di luar batas objek array.
Istilah terkait lainnya adalah 'perilaku tidak ditentukan'. Ini adalah jenis antara implementasi yang ditentukan dan perilaku yang tidak ditentukan. untuk perilaku yang tidak ditentukan, kompilator harus melakukan sesuatu sesuai dengan standar, tetapi pilihan mana yang diberikan standar itu terserah pada kompilator dan tidak perlu didefinisikan (atau bahkan konsisten). Hal-hal seperti urutan evaluasi sub-ekspresi termasuk dalam kategori ini. Kompilator dapat melakukan ini dalam urutan apa pun yang disukainya, dan dapat melakukannya secara berbeda dalam build yang berbeda atau bahkan dalam proses build yang sama berbeda (tidak mungkin, tetapi diizinkan).
sumber
Versi singkatnya:
Perilaku yang ditentukan implementasi (IB): Diprogram dengan benar tetapi tidak dapat ditentukan *
Perilaku tidak terdefinisi (UB): Diprogram salah (mis. Bug !)
*) "tak tentu" sejauh menyangkut standar bahasa, itu tentu saja akan ditentukan pada platform tetap mana pun.
sumber
UB: Perilaku Tidak Terdefinisi
IB: Perilaku yang Ditentukan Penerapan
sumber