Regla 0x6004h: No reutilices una variable para propósitos distintos
Proceso, diseno y construccion sistematica (0x60XX)
0x6004h: No reutilices una variable para propósitos distintos¶
Enunciado normativo¶
Cada variable DEBE representar una sola cosa durante toda su vida. NO DEBE reciclarse una variable para almacenar un dato de naturaleza o significado distinto del original.
¿Por qué existe esta regla?¶
El problema¶
Cuando una variable cambia de significado, su nombre deja de ser veraz en la segunda mitad de la función. El lector que la vio como “acumulador” y la encuentra como “índice” debe mantener dos interpretaciones simultáneas, y el depurador muestra un valor que no corresponde al significado del nombre.
Reutilizar variables “para ahorrar memoria” es un reflejo heredado de contextos con recursos limitados. En un programa moderno la claridad vale más que cuatro bytes de pila.
Consecuencias de violarla¶
| Tipo de consecuencia | Efecto concreto |
|---|---|
| Bug silencioso | El valor anterior no se reinicia y contamina el nuevo uso. |
| Lectura | El nombre engaña a partir del segundo uso. |
| Depuración | No se puede observar el primer valor una vez reutilizada. |
| Mantenimiento | Agregar un caso entre ambos usos es impredecible. |
Fundamento en la cátedra¶
Es la contracara de 0x0101h: Los identificadores deben ser descriptivos: un nombre descriptivo pierde sentido si la variable cambia de rol. También se relaciona con 0x2011h: Prohibición de asignaciones múltiples a una variable sin lectura intermedia (dead store), que detecta la secuencia “asignar sin leer” típica del reciclado.
Alcance y excepciones¶
Aplica a variables locales. Un contador de lazo que se reinicia para un
segundo lazo independiente se considera reutilización; conviene declarar
uno nuevo dentro de cada for. Los acumuladores que sí continúan el mismo
cómputo no son una violación: siguen representando la misma cosa.
Ejemplos exhaustivos¶
❌ Contraejemplo 1 — De acumulador a índice¶
int suma = 0;
for (int i = 0; i < n; i++) {
suma += v[i];
}
suma = 0;
while (suma < n && v[suma] != buscado) {
suma++;
}Por qué falla: suma pasa de guardar una suma a ser un índice de búsqueda. El
nombre miente en el segundo bloque y, si se olvidara el suma = 0, la
búsqueda empezaría en una posición arbitraria.
❌ Contraejemplo 2 — De resultado a bandera¶
int resultado = calcular(a, b);
printf("resultado = %d\n", resultado);
resultado = (resultado > 10);
if (resultado) {
/* ... */
}Por qué falla: resultado deja de ser el valor y pasa a ser un booleano
derivado. Se pierde el valor original y el tipo deja de reflejar el contenido.
✅ Ejemplo conforme 1 — Una variable por rol¶
int suma = 0;
for (int i = 0; i < n; i++) {
suma += v[i];
}
size_t posicion = 0;
while (posicion < (size_t)n && v[posicion] != buscado) {
posicion++;
}Cada nombre describe exactamente su contenido durante toda su vida.
✅ Ejemplo conforme 2 — Bandera con nombre propio¶
int resultado = calcular(a, b);
printf("resultado = %d\n", resultado);
bool es_grande = resultado > 10;
if (es_grande) {
/* ... */
}El valor original se conserva y la condición derivada tiene su propio nombre, que expresa su rol.
⚠️ Casos límite¶
Continuidad real: sumar primero y seguir sumando después es el mismo rol; no se exige una variable nueva.
Bucles anidados: es preferible un
idistinto por nivel (i,j) a reutilizarien el lazo interno.Intercambio de valores: el swap temporal sí reutiliza una auxiliar de vida muy corta; es aceptable si su nombre es neutro (
aux) y su alcance es mínimo.
Cómo detectarla¶
| Herramienta | Comando | Señal |
|---|---|---|
gaff | gaff check archivo.c | Regla 0x2011h (dead store) en reciclados sin lectura. |
gcc | gcc -Wall -Wextra | -Wunused-but-set-variable en algunos casos. |
| Revisión manual | — | Un nombre que no concuerda con lo que guarda a mitad de función. |
Checklist de autocontrol¶
¿Cada variable conserva un único significado de principio a fin?
¿El nombre sigue siendo veraz en el último uso?
¿Reinicié un contador en vez de declarar uno nuevo?
¿Podría inspeccionar el valor original en el depurador?
Reglas relacionadas¶
0x0101h: Los identificadores deben ser descriptivos — nombres descriptivos.
0x2011h: Prohibición de asignaciones múltiples a una variable sin lectura intermedia (dead store) — asignaciones sin lectura intermedia.
0x6003h: Declará cada variable lo más cerca posible de su primer uso — alcance mínimo de las variables.
0x7001h: Siempre debés inicializar las variables a un valor conocido — inicialización en la declaración.