Perilaku tidak terdefinisi dalam C ++


Situasi ketika kode C ++ secara sintaksis valid, tetapi perilakunya tidak didefinisikan dalam Standar, sering disebut perilaku tidak terdefinisi dalam literatur berbahasa Rusia. Dalam Standar itu sendiri, untuk situasi seperti itu ada sebanyak 3 istilah: perilaku tidak terdefinisi , perilaku tidak spesifik , dan perilaku yang ditentukan implementasi . Dalam catatan singkat ini kita akan memahami perbedaannya.


Perilaku yang ditentukan implementasi


Istilah ini digunakan untuk menggambarkan situasi di mana kode C ++ sepenuhnya valid, tetapi perilakunya tergantung pada implementasi (misalnya, kompiler atau runtime), dan perilaku ini didokumentasikan . Sebagai contoh, ukuran dalam byte dari pointer atau tipe int tergantung pada pengaturan implementasi atau kompiler tertentu, tetapi ini dijelaskan dalam dokumentasi, dan Anda dapat mengandalkan dokumentasi ini.


Perilaku yang tidak ditentukan


Istilah ini berarti bahwa perilaku kode C ++ yang valid tidak didefinisikan oleh Standar dan tergantung pada implementasinya, apalagi tidak didokumentasikan (setidaknya secara resmi). Contoh: prosedur untuk menghitung nilai argumen fungsi ditentukan oleh kompiler, tetapi tidak ada deskripsi bagaimana. Standar ini memberi tahu kita: ini adalah fitur perilaku yang tidak diperbaiki di mana pun, oleh karena itu, Anda tidak dapat mengandalkannya. Karenanya, perilaku kode Anda tidak boleh bergantung pada fitur-fitur ini.


Perilaku tidak terdefinisi


Ini adalah varian ketidakpastian yang paling berbahaya. Dalam Standar, ini digunakan untuk menggambarkan perilaku yang dapat menyebabkan konsekuensi yang sama sekali tidak dapat diprediksi. Contoh yang paling mencolok adalah mengakses batas-batas array atau mendereferensi pointer ke objek yang dibebaskan. Bagian terburuknya adalah bahwa program tidak harus berakhir segera atau bahkan menghasilkan kesalahan, namun perilakunya tidak dapat lagi diandalkan.


Sebagai kesimpulan, saya mengingatkan Anda sekali lagi bahwa semua istilah di atas merujuk pada kode yang valid secara sintaksis yang akan berhasil dikompilasi (namun, kompiler sering memberikan peringatan untuk kasus perilaku undefined yang paling jelas). Kode yang tidak valid dari sudut pandang Standar disebut program yang salah bentuk .

Source: https://habr.com/ru/post/id450910/


All Articles