Regla 0x100Ah: Prohibición de estructuras de control con cuerpo vacío (if (...);)
Estructuras de control y flujo (0x10XX)
0x100Ah: Prohibición de estructuras de control con cuerpo vacío (if (...);)¶
Enunciado normativo¶
NO DEBE colarse un punto y coma inmediatamente después de la condición de un
if,while,foroswitchcuando se pretende que las sentencias siguientes formen el cuerpo. Toda estructura de control DEBE tener un cuerpo explícito delimitado con llaves (ver 0x1001h: Todas las estructuras de control deben utilizar llaves).
¿Por qué existe esta regla?¶
El problema¶
El punto y coma es una sentencia vacía válida en C. Escrito tras la condición
de un if o un while, se convierte en el cuerpo de esa estructura. Las
sentencias que siguen, aunque estén indentadas, quedan fuera del control y
se ejecutan sin condición.
El error es de una sola tecla y el compilador no lo denuncia: el programa compila y hace algo, solo que distinto de lo que el autor cree. Es una de las causas más frecuentes de “funciona a veces” en las entregas iniciales.
Consecuencias de violarla¶
| Tipo de consecuencia | Efecto concreto |
|---|---|
| Bug lógico grave | El bloque se ejecuta siempre, haya o no cumplido la condición. |
| Lazo infinito | while (cond); gira para siempre sin cambiar el estado. |
| Legibilidad | La indentación miente sobre qué pertenece al control. |
| Mantenibilidad | Un lector desprevenido “arregla” el código moviendo llaves. |
Fundamento en el estándar y en la cátedra¶
ISO/IEC 9899:2011 §6.8.3 define la sentencia nula como una sentencia válida, y
§6.8.4.1 asocia el cuerpo del if a la sentencia inmediata. La cátedra prohíbe
el cuerpo nulo como señal de error lógico y exige llaves, lo que deja el error a
la vista. Se complementa con 0x1001h: Todas las estructuras de control deben utilizar llaves y con 0x1009h: Prohibición de asignaciones simples dentro de condiciones lógicas.
Alcance y excepciones¶
Prohibido en cualquier estructura de control con o sin
else.No hay “cuerpo vacío intencional”: si se quiere consumir entrada sin procesar, se escribe un cuerpo con llaves y un comentario que lo explique.
El
;de separación entrefory su cuerpo nulo es la violación más común.
Ejemplos exhaustivos¶
❌ Contraejemplo 1 — if con ; accidental¶
if (x > 0);
{
procesar(x);
}Por qué falla: el if tiene como cuerpo la sentencia vacía; el bloque entre
llaves se ejecuta siempre. El programa procesa x incluso cuando no debería.
❌ Contraejemplo 2 — while con cuerpo nulo¶
while (leer_caracter() != '\n');Por qué falla: el lazo consume caracteres hasta el fin de línea, pero eso no es
lo que el lector entiende a simple vista. Si leer_caracter tiene un efecto
lateral, el código depende de él y lo oculta.
✅ Ejemplo conforme 1 — llaves y cuerpo explícito¶
if (x > 0)
{
procesar(x);
}El cuerpo está delimitado y la llave elimina toda posibilidad de una sentencia nula intermedia.
✅ Ejemplo conforme 2 — consumo deliberado y documentado¶
while (leer_caracter() != '\n')
{
// se descarta el resto de la linea
}Aunque el cuerpo no haga nada, las llaves y el comentario declaran que el consumo es intencional; no hay punto y coma huérfano.
⚠️ Casos límite¶
for ( ; ; );: es un lazo infinito con cuerpo nulo; debe ser un error evidente, nunca una construcción válida en una entrega.ifseguido de declaración de variable: no aplicar el error de querer declarar dentro de unifsin llaves.Comentario entre la condición y el
;: el;sigue siendo el cuerpo; los comentarios no cambian la semántica.
Cómo detectarla¶
| Herramienta | Comando | Señal |
|---|---|---|
gaff | gaff check archivo.c | Regla 0x100Ah: cuerpo vacío. |
gcc | gcc -Wall -Wextra -Wempty-body | warning: suggest braces around empty body. |
| Revisión manual | — | Condición que termina en ; seguida de un bloque. |
Checklist de autocontrol¶
¿Ninguna condición termina en
;?¿Reemplacé
if (...);porif (...) { ... }?Si el cuerpo vacío era intencional, ¿está entre llaves y comentado?
¿Compilé con
-Wempty-body?
Reglas relacionadas¶
0x1001h: Todas las estructuras de control deben utilizar llaves — la llave obligatoria evita el cuerpo nulo accidental.
0x1009h: Prohibición de asignaciones simples dentro de condiciones lógicas — otra trampa sintáctica silenciosa en condiciones.
0x1002h: Restringí el uso de break y continue; preferí lazos con bandera de control — los lazos de consumo deben expresar su corte con claridad.