Regla 0x5002h: Desarrollá y compilá siempre con todas las advertencias del compilador activadas
Compilacion, preprocesador y seguridad (0x50XX)
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 -pedanticy-std=c11, tanto engcccomo enclang. 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 consecuencia | Efecto concreto |
|---|---|
| Bug silencioso | Una variable sin inicializar se usa con basura residual y el resultado es errático. |
| Comportamiento indefinido | Desajustes de formato en printf (%d con long) que no compilan con -Wformat. |
| Portabilidad | Código aceptado por un compilador permisivo falla en otro más estricto. |
| Mantenibilidad | Se 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
$ ./appPor 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 appPor 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 appTodas 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 appCentralizar 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¶
-Werrory advertencias nuevas: al actualizar el compilador pueden aparecer advertencias legítimas; se corrigen, no se silencian.Código generado por herramientas: puede requerir exclusiones puntuales documentadas; nunca para código propio.
clangvsgcc: algunos diagnósticos difieren; se exige que pase en ambos.-Wextrahabilita controles que-Wallno activa.Advertencias de enlace:
-Werrorno cubreld; los símbolos duplicados (ver 0x500Ch: Prohibición de inclusión directa de archivos de código fuente C (.c)) se detectan igualmente.
Cómo detectarla¶
| Herramienta | Comando | Señal |
|---|---|---|
gcc | gcc -std=c11 -Wall -Wextra -Werror -pedantic archivo.c | Cualquier warning: es un fallo de compilación. |
clang | clang -std=c11 -Wall -Wextra -Werror -pedantic archivo.c | Diagnósticos equivalentes con otro texto. |
Revisión del Makefile | grep CFLAGS Makefile | Ausencia de -Wall -Wextra -Werror -pedantic. |
gaff | gaff check archivo.c | Marca el archivo como no compilado con el perfil canónico (metadato de entrega). |
Checklist de autocontrol¶
¿Compilé con
-std=c11 -Wall -Wextra -Werror -pedantic?¿La salida no tiene ninguna advertencia?
¿El
Makefiletiene las banderas centralizadas enCFLAGS?¿Evité
-w,-fpermissiveo#pragmapara silenciar avisos?¿Probé también con
clang?
Reglas relacionadas¶
0x5010h: Prohibición de directivas #pragma no estándar o privativas — no silencies diagnósticos con
#pragmaprivativos; corregí la causa.0x5001h: Los arreglos estáticos deben ser creados con un tamaño fijo en tiempo de compilación —
-Wvlaes una de las advertencias que estas banderas ponen en juego.0x500Bh: Inclusión obligatoria de cabeceras estándar para funciones de la biblioteca C —
-Wimplicit-function-declarationobliga a incluir la cabecera correcta.0x500Ch: Prohibición de inclusión directa de archivos de código fuente C (.c) — los errores de enlace complementan los diagnósticos del compilador.