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 0x301Ch: Detector de variables locales no inicializadas con modificador const

Memoria, punteros y tipos (0x30XX)

Universidad Nacional de Río Negro

0x301Ch: Detector de variables locales no inicializadas con modificador const

Enunciado normativo

Toda variable declarada con el calificador const DEBE inicializarse en la misma sentencia de su declaración. NO DEBE declararse un objeto const sin valor.

¿Por qué existe esta regla?

El problema

const significa que el objeto no puede modificarse después de su creación. En C no hay constructores ni una lista de inicialización diferida: la única oportunidad de darle un valor a un objeto const es su declarador. Si se declara const int limite; sin inicializador, no queda ningún camino legal para asignarle un valor: limite = 10; es un error de compilación porque el objeto es de sólo lectura. El resultado es un objeto inmutable al que nunca se le dio contenido; leerlo produce un valor indeterminado, y el estándar trata esa lectura como comportamiento indefinido para objetos automáticos.

Consecuencias de violarla

Tipo de consecuenciaEfecto concreto
Compilaciónlimite = 10; produce error: assignment of read-only variable 'limite'.
Comportamiento indefinidoLeer el objeto const sin inicializar es leer un valor indeterminado.
Bug silenciosogcc advierte sólo cuando detecta el uso; si no, el valor basura viaja hasta el resultado.
MantenibilidadEl lector no puede saber cuál debía ser el valor original.

Fundamento en el estándar y en la cátedra

ISO/IEC 9899:2011 §6.7.9 (Initialization), §6.7.3 (Type qualifiers) y §6.2.4 (Storage durations) sustentan la regla: un objeto automático sin inicializador explícito tiene valor indeterminado (§6.7.9p10), y un objeto const no admite asignación posterior. La cátedra la exige porque un const vacío suele esconder la intención de “declarar y luego calcular”; ese patrón se escribe con una variable no const y, si se desea, una copia const al final del cálculo.

Alcance y excepciones

Aplica a objetos locales y a los de duración estática de nivel de archivo. Los de duración estática se inicializan a cero por el estándar (§6.7.9p10), pero la cátedra pide el inicializador explícito por claridad. No aplica a parámetros const (el inicializador es el argumento) ni a una declaración extern const (es sólo una declaración, no una definición). En un miembro const de struct, el valor se aporta en el inicializador del agregado.

Ejemplos exhaustivos

❌ Contraejemplo 1 — const usado como tamaño de arreglo

const int limite;
int valores[limite];

Por qué falla: limite nunca recibe valor y se usa como dimensión. Además, el arreglo resulta un VLA, prohibido por 0x5001h: Los arreglos estáticos deben ser creados con un tamaño fijo en tiempo de compilación; los dos defectos se potencian.

❌ Contraejemplo 2 — const leído en una fórmula

const double iva;
double total = base * (1.0 + iva);

Por qué falla: compila con advertencia, pero iva contiene basura de la pila. El resultado es indefinido y no reproducible entre ejecuciones.

✅ Ejemplo conforme 1 — Escalar inicializado

const int limite = 100;
int valores[100];

Por qué cumple: el valor queda fijado en la declaración y el arreglo tiene tamaño constante en tiempo de compilación.

✅ Ejemplo conforme 2 — Varios niveles de const

const double iva = 0.21;
const char * const mensaje = "ok";

Por qué cumple: en la segunda línea, tanto el puntero como el contenido apuntado son inmutables y ambos quedan fijados al declarar; el orden de calificadores sigue 0x3017h: Orden canónico de calificadores: ‘const tipo’ en lugar de ‘tipo const’.

⚠️ Casos límite

Cómo detectarla

HerramientaComandoSeñal
gaffgaff check archivo.cReporta un const local declarado sin inicializador.
gcc / clanggcc -Wall -Wextra -std=c11 -c archivo.cwarning: uninitialized const 'limite' cuando el uso es visible.
Revisión manualDeclaraciones const tipo nombre; sin = valor.

Checklist de autocontrol

Reglas relacionadas