El puntero nulo y el espacio de direcciones sin memoria

Fuentes: Null pointers and the vast unused address space

El concepto de puntero nulo resulta conceptualmente extraño si se examina más allá de su función de seguridad: se trata de un único valor insertado dentro de un tipo puntero que, en lugar de almacenar una dirección, transmite información semántica distinta según el contexto. En C suele señalar un error; en otros lenguajes indica la ausencia de un valor; en ciertas funciones sirve para pedir que el receptor reserve su propia memoria, todo con un solo valor. Lo peculiar es que, en la práctica, los punteros de usuario no agotan el rango de 64 bits disponible: en Linux solo utilizan 48 bits, y una enorme franja de direcciones bajas (por debajo de 0x1000) tampoco es válida, por lo que existen millones de valores no-dirección disponibles sin coste adicional. El artículo propone un experimento mental inspirado en Hare: funciones como bufio::scan_line devuelven uniones etiquetadas del tipo (str | io::EOF | io::error | utf8::invalid), donde una etiqueta acompaña al puntero para distinguir entre datos válidos y errores. Si se aprovecharan las direcciones imposibles, EOF podría codificarse como 0x1, los distintos errores de E/S como otros valores reservados y la etiqueta completa desaparecería, reduciendo el retorno a dos registros de 64 bits (puntero y longitud). La idea es similar al NaN boxing, pero aplicada a punteros en vez de a números en coma flotante: si el nulo ya existe como mecanismo para incrustar metadatos dentro de un puntero, no hay razón para que sea el único valor especial, y podrían añadirse más aprovechando el espacio de direcciones no mapeadas, aunque el autor reconoce que se trata solo de una reflexión experimental.