Saya menulis kode C untuk sistem di mana alamat 0x0000 valid dan berisi port I / O. Oleh karena itu, setiap kemungkinan bug yang mengakses pointer NULL akan tetap tidak terdeteksi dan pada saat yang sama menyebabkan perilaku berbahaya.
Untuk alasan ini saya ingin mendefinisikan kembali NULL menjadi alamat lain, misalnya alamat yang tidak valid. Jika saya tidak sengaja mengakses alamat seperti itu, saya akan mendapatkan interupsi perangkat keras di mana saya dapat menangani kesalahan tersebut. Saya kebetulan memiliki akses ke stddef.h untuk kompiler ini, jadi saya benar-benar dapat mengubah header standar dan mendefinisikan ulang NULL.
Pertanyaan saya adalah: apakah ini akan bertentangan dengan standar C? Sejauh yang saya tahu dari 7.17 dalam standar, makro adalah implementasi-didefinisikan. Apakah ada hal lain dalam standar yang menyatakan bahwa NULL harus 0?
Masalah lainnya adalah banyak kompiler melakukan inisialisasi statis dengan mengatur semuanya ke nol, apa pun tipe datanya. Meskipun standar mengatakan bahwa kompilator harus mengatur bilangan bulat ke nol dan penunjuk ke NULL. Jika saya akan mendefinisikan ulang NULL untuk kompiler saya, maka saya tahu bahwa inisialisasi statis seperti itu akan gagal. Dapatkah saya menganggapnya sebagai perilaku kompilator yang salah meskipun saya dengan berani mengubah header kompiler secara manual? Karena saya tahu pasti bahwa kompilator khusus ini tidak mengakses makro NULL ketika melakukan inisialisasi statis.
if(ptr) { /* do something on ptr*/ }
? Apakah akan berhasil jika NULL didefinisikan berbeda dari 0x0?
mprotect
untuk mengamankan. Atau, jika platform tidak memiliki ASLR atau sejenisnya, alamat di luar memori fisik platform. Semoga berhasil.