Я пишу C-код для системы, где адрес 0x0000 действителен и содержит порты ввода-вывода. Поэтому любые возможные ошибки, которые обращаются к указателю NULL, остаются необнаруженными и в то же время вызывают опасное поведение.
По этой причине я хочу переопределить NULL как другой адрес, например, недопустимый адрес. Если я случайно получаю такой адрес, я получу аппаратное прерывание, где я могу обработать ошибку. У меня есть доступ к stddef.h для этого компилятора, поэтому я могу фактически изменить стандартный заголовок и переопределить NULL.
Мой вопрос: будет ли это противоречить стандарту C? Насколько я могу судить по стандарту 7.17, макрос определяется реализацией. Есть ли что-либо в другом месте в стандарте, в котором указано, что NULL должен быть 0?
Другая проблема заключается в том, что многие компиляторы выполняют статическую инициализацию, устанавливая все в нуль независимо от типа данных. Несмотря на то, что в стандарте говорится, что компилятор должен установить целые числа в нуль и указатели на NULL. Если я буду переопределять NULL для моего компилятора, тогда я знаю, что такая статическая инициализация завершится неудачно. Могу ли я считать это неправильным поведением компилятора, хотя я смело изменил заголовки компилятора вручную? Потому что я точно знаю, что этот конкретный компилятор не получает доступ к макросу NULL при статической инициализации.