¿Forma estándar C de acceder a la dirección de puntero nulo?
En C, defendiendo elpuntero nulo es Comportamiento indefinido, sin embargo, el valor del puntero nulo tiene una representación de bits que, en algunas arquitecturas, apunta a una dirección válida (por ejemplo, la dirección 0).
Llamemos a esta dirección eldirección de puntero nula, por el bien de la claridad.
Supongamos que quiero escribir una pieza de software en C, en un entorno con acceso ilimitado a la memoria. Supongamos además que quiero escribir algunos datos en la dirección del puntero nulo:¿Cómo lo lograría de manera estándar?
Caso de ejemplo (IA32e):
#include <stdint.h>
int main()
{
uintptr_t zero = 0;
char* p = (char*)zero;
return *p;
}
Este código cuando se compila con gcc con-O3 para IA32e se transforma en
movzx eax, BYTE PTR [0]
ud2
debido a UB (0 es la representación en bits del puntero nulo).
Como C está cerca de la programación de bajo nivel, creo que debe haber una forma de acceder a la dirección de puntero nulo y evitar UB.
Para ser claro
Estoy preguntando qué dice la norma sobre esto,NO cómo lograr esto de una manera definida en la implementación.
Sé la respuesta para el último.