Undefined Behavior (UB) es el comportamiento de un programa cuyo resultado no está definido por el estándar del lenguaje C. El compilador o el sistema pueden realizar cualquier acción, desde un error imperceptible hasta un fallo total o corrupción de datos.
Causas típicas de UB:
Cómo minimizar UB:
int arr[5]; arr[10] = 0; // UB — acceso fuera de los límites de un arreglo int* p = NULL; *p = 42; // UB — dereferenciación de puntero NULL
Pregunta: ¿Cómo se comportará el programa si se realiza una división de un número entero por cero?
Respuesta: Según el estándar C (ISO C99 6.5.5), la división por 0 es un comportamiento indefinido. Puede provocar un crash, aparición de datos aleatorios o incluso una salida "lógicamente correcta", pero el estándar no garantiza ningún resultado.
int a = 10, b = 0; printf("%d", a / b); // Comportamiento indefinido
Historia
En uno de los proyectos de sistemas embebidos, un programador escribió un ciclo para un arreglo y, accidentalmente, accedió a un elemento fuera de sus límites. La aplicación funcionó bien, pero después de un mes comenzaron a ocurrir corrupciones de otros datos en memoria (errores temporales, difíciles de reproducir). El problema se encontró solo después de una revisión cuidadosa y verificación con un analizador estático.
Historia
Un desarrollador supuso que el resultado de la dereferenciación de un puntero NULL siempre provocaba un crash, por lo que no añadió verificaciones para NULL. Sin embargo, en una plataforma rara, esto provocaba una modificación incorrecta (pero no fatal) de la memoria, lo que rompía otras estructuras y conducía a errores difíciles de detectar.
Historia
Al generar números pseudoaleatorios se utilizó división, y con ciertos valores de entrada se producía una división por 0. En la mayoría de las plataformas, el programa simplemente "se caía", pero en una de ellas, el resultado era un número incorrecto, lo que dificultaba la reproducción de errores entre diferentes entornos.