ProgramaciónDesarrollador C

¿Qué es el 'undefined behavior' en el lenguaje C? Proporcione ejemplos de su ocurrencia y formas de minimizar estos problemas.

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

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:

  • Acceso fuera de los límites de un arreglo
  • Dereferenciación de un puntero no inicializado/invalido
  • División por 0
  • Modificación de constantes

Cómo minimizar UB:

  • Siempre inicializar variables
  • Verificar índices de arreglos
  • Utilizar analizadores de código estáticos y dinámicos (por ejemplo, valgrind, AddressSanitizer)

Ejemplo de código:

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 capciosa.

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.

Ejemplo de código:

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.