Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Regla 0x6004h: No reutilices una variable para propósitos distintos

Proceso, diseno y construccion sistematica (0x60XX)

Universidad Nacional de Río Negro

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 consecuenciaEfecto concreto
Bug silenciosoEl valor anterior no se reinicia y contamina el nuevo uso.
LecturaEl nombre engaña a partir del segundo uso.
DepuraciónNo se puede observar el primer valor una vez reutilizada.
MantenimientoAgregar 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

Cómo detectarla

HerramientaComandoSeñal
gaffgaff check archivo.cRegla 0x2011h (dead store) en reciclados sin lectura.
gccgcc -Wall -Wextra-Wunused-but-set-variable en algunos casos.
Revisión manualUn nombre que no concuerda con lo que guarda a mitad de función.

Checklist de autocontrol

Reglas relacionadas