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 0x5002h: Desarrollá y compilá siempre con todas las advertencias del compilador activadas

Compilacion, preprocesador y seguridad (0x50XX)

Universidad Nacional de Río Negro

0x5002h: Desarrollá y compilá siempre con todas las advertencias del compilador activadas

Enunciado normativo

DEBE compilarse todo el código con el conjunto de advertencias -Wall -Wextra -Werror -pedantic y -std=c11, tanto en gcc como en clang. NO DEBE entregarse código que sólo compile sin advertencias en una configuración reducida.

¿Por qué existe esta regla?

El problema

El compilador de C detecta gratis una enorme cantidad de defectos: variables no usadas ni inicializadas, retornos faltantes, comparaciones entre tipos con signo distinto, formatos de printf que no coinciden con sus argumentos, declaraciones implícitas y VLA, entre muchos otros. Por omisión, gcc sólo emite una fracción mínima de esos diagnósticos; el resto permanece latente hasta que el bug se manifiesta en ejecución.

Activar las advertencias convierte el compilador en un revisor estático permanente. Agregar -Werror obliga a tratar cada advertencia como error: no se puede «entregar igual» ignorando la salida.

Consecuencias de violarla

Tipo de consecuenciaEfecto concreto
Bug silenciosoUna variable sin inicializar se usa con basura residual y el resultado es errático.
Comportamiento indefinidoDesajustes de formato en printf (%d con long) que no compilan con -Wformat.
PortabilidadCódigo aceptado por un compilador permisivo falla en otro más estricto.
MantenibilidadSe acumulan defectos que luego cuesta aislar en el depurador.

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

El estándar ISO/IEC 9899:2011 no obliga a emitir diagnósticos por cada construcción dudosa, pero sí distingue entre diagnóstico y comportamiento indefinido. La cátedra adopta el conjunto canónico porque es el mismo que usa el sandbox de corrección: gcc -std=c11 -Wall -Wextra -Werror -pedantic. Así, lo que el alumno ve en su máquina es exactamente lo que verá el corrector.

Alcance y excepciones

Aplica a todas las entregas de la materia, incluidas las prácticas cortas. Excepción razonable: al integrar código de terceros o bibliotecas externas que no controlás, puede aislarse la advertencia con banderas por archivo (#pragma GCC diagnostic, desaconsejado) o, preferentemente, compilando esa unidad aparte; nunca desactivar las advertencias para el código propio.

Ejemplos exhaustivos

❌ Contraejemplo 1 — Compilar con la configuración por defecto

$ gcc main.c -o app
$ ./app

Por qué falla: sin banderas, gcc acepta variables sin inicializar, formatos incorrectos y funciones sin prototipo. El programa puede «funcionar» en la prueba y fallar en la corrección.

❌ Contraejemplo 2 — Bajar la exigencia para que compile

$ gcc -w main.c -o app
$ gcc -std=gnu89 -fpermissive main.c -o app

Por qué falla: -w suprime todas las advertencias y -fpermissive degrada errores a avisos. El código defectuoso queda oculto y la deuda se traslada al runtime; además incumple directamente esta regla.

✅ Ejemplo conforme 1 — Línea de compilación canónica

gcc -std=c11 -Wall -Wextra -Werror -pedantic -g main.c -o app

Todas las advertencias relevantes están activas y cualquier diagnóstico detiene la compilación, forzando a corregirlo antes de continuar.

✅ Ejemplo conforme 2 — CFLAGS en un Makefile

CC     = gcc
CFLAGS = -std=c11 -Wall -Wextra -Werror -pedantic -g

app: main.o lista.o
	$(CC) $(CFLAGS) $^ -o $@

clean:
	rm -f *.o app

Centralizar las banderas evita que una compilación manual se haga con una configuración distinta y garantiza que todos los objetos usen el mismo estándar. Convive con 0x5005h: Organizá la estructura de tus archivos .c de forma estándar (estructura de archivos) y con la compilación separada de 0x500Ch: Prohibición de inclusión directa de archivos de código fuente C (.c).

⚠️ Casos límite

Cómo detectarla

HerramientaComandoSeñal
gccgcc -std=c11 -Wall -Wextra -Werror -pedantic archivo.cCualquier warning: es un fallo de compilación.
clangclang -std=c11 -Wall -Wextra -Werror -pedantic archivo.cDiagnósticos equivalentes con otro texto.
Revisión del Makefilegrep CFLAGS MakefileAusencia de -Wall -Wextra -Werror -pedantic.
gaffgaff check archivo.cMarca el archivo como no compilado con el perfil canónico (metadato de entrega).

Checklist de autocontrol

Reglas relacionadas