Comportamiento indefinido en C: por qué no es seguro

Fuentes: Undefined behavior in C is not safe

El comportamiento indefinido (UB) en C no es un error predecible que simplemente cause un fallo de segmento; su resultado es arbitrario y puede variar entre compiladores y versiones. Un artículo técnico desmiente la creencia de que el UB es aceptable porque el código 'debería' funcionar como se espera, demostrando mediante ejemplos de ensamblaje cómo las instrucciones pueden ejecutarse de formas inesperadas.

El texto analiza tres escenarios críticos. Primero, muestra cómo una función no llamada puede ejecutarse si el compilador optimiza y elimina la llamada, ejecutando código residual en memoria. Segundo, ilustra que el acceso a un puntero nulo no siempre genera un fallo de segmento inmediato; en algunos casos, el compilador emite instrucciones que escriben valores aleatorios en la dirección cero antes de causar un crash, o incluso omite la ejecución del código afectado para ahorrar espacio en binario. Tercero, explica que la aritmética de punteros nulos puede generar resultados que parecen lógicos a simple vista, como escribir en direcciones específicas, aunque el compilador no detecta el UB porque el problema de la parada impide predecir si el código será ejecutado.

La conclusión es que el UB puede hacer 'cualquier cosa'. Los compiladores no están obligados a detectar o prevenir el UB, y su comportamiento ante estas situaciones es inconsistente. Para garantizar la seguridad y la portabilidad, es imperativo tratar cualquier comportamiento indefinido como un error crítico que debe ser eliminado, ya que las suposiciones sobre el resultado del código son incorrectas y peligrosas.