Ini adalah salah satu kasus sudut aneh di mana kami tunduk pada batasan bahasa Inggris dan struktur yang tidak konsisten dalam standar. Jadi paling banter, saya bisa membuat argumen tandingan yang meyakinkan, karena tidak mungkin membuktikannya :) 1
Kode dalam pertanyaan menunjukkan perilaku yang terdefinisi dengan baik.
Karena [7.1.4] adalah dasar pertanyaannya, mari kita mulai dari sana:
Masing-masing pernyataan berikut berlaku kecuali secara eksplisit dinyatakan lain dalam deskripsi mendetail yang mengikuti: Jika argumen ke suatu fungsi memiliki nilai yang tidak valid ( seperti nilai di luar domain fungsi, atau penunjuk di luar ruang alamat program, atau pointer nol , [... contoh lain ...] ) [...] perilaku tidak ditentukan. [... pernyataan lain ...]
Ini adalah bahasa yang kikuk. Salah satu interpretasinya adalah bahwa item dalam daftar adalah UB untuk semua fungsi perpustakaan, kecuali diganti dengan deskripsi individu. Namun daftar tersebut dimulai dengan "seperti", yang menunjukkan bahwa ini ilustrasi, bukan lengkap. Misalnya, ia tidak menyebutkan penghentian null string yang benar (penting untuk perilaku misalnya strcpy
).
Jadi jelas maksud / ruang lingkup 7.1.4 hanyalah bahwa "nilai tidak valid" mengarah ke UB ( kecuali dinyatakan lain ). Kita harus melihat deskripsi setiap fungsi untuk menentukan apa yang dianggap sebagai "nilai tidak valid".
Contoh 1 - strcpy
[7.21.2.3] hanya mengatakan ini:
The strcpy
salinan fungsi string yang ditunjukkan oleh s2
(termasuk karakter null terminating) ke dalam array yang ditunjukkan oleh s1
. Jika penyalinan terjadi di antara objek yang tumpang tindih, perilakunya tidak ditentukan.
Itu tidak menyebutkan secara eksplisit pointer nol, namun juga tidak menyebutkan terminator nol. Sebaliknya, seseorang menyimpulkan dari "string yang ditunjukkan oleh s2
" bahwa satu-satunya nilai yang valid adalah string (yaitu, penunjuk ke array karakter yang diakhiri dengan null).
Memang, pola ini dapat dilihat di seluruh deskripsi individu. Beberapa contoh lain:
[7.6.4.1 (fenv)] menyimpan lingkungan floating-point saat ini di objek yang ditunjuk olehenvp
[7.12.6.4 (frexp)] menyimpan integer dalam obyek int yang ditunjuk olehexp
[7.19.5.1 (fclose)] yang aliran menunjuk olehstream
Contoh 2 - printf
[7.19.6.1] mengatakan ini tentang %p
:
p
- Argumen harus menjadi petunjuk void
. Nilai penunjuk diubah menjadi urutan karakter pencetakan, dengan cara yang ditentukan implementasi.
Null adalah nilai pointer yang valid, dan bagian ini tidak menyebutkan secara eksplisit bahwa null adalah kasus khusus, atau pointer harus menunjuk ke suatu objek. Dengan demikian itu didefinisikan perilaku.
1. Kecuali jika penulis standar tampil ke depan, atau kecuali kita dapat menemukan sesuatu yang mirip dengan dokumen alasan yang menjelaskan hal-hal.