# GCC Warnings **Compiler warnings catch bugs** at compile time—uninitialized variables, type mismatches, unused code, unreachable statements. Treating warnings as bugs forces you to write cleaner code. ```bash gcc -Wall -Wextra -Wpedantic -o app app.c ``` `-Wall` enables a curated set of common warnings (despite the name, it's not "all warnings"). `-Wextra` adds additional checks. `-Wpedantic` flags non-standard GNU extensions, useful for portability. **Common warnings:** ``` -Wuninitialized uninitialized variable usage -Wshadow variable shadows an outer scope variable -Wunused-variable declared but never used -Wunused-result result of function call discarded -Wtype-limits comparison always true/false (logic error) -Wstrict-overflow signed integer overflow (undefined behavior) -Wformat printf format string mismatches ``` **Treating warnings as errors:** ```bash gcc -Wall -Wextra -Werror -o app app.c ``` `-Werror` converts warnings to errors, halting compilation. Forces you to fix issues immediately. Recommended for production builds and CI/CD. **Selectively disabling warnings:** ```c #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-variable" int unused_var = 0; #pragma GCC diagnostic pop ``` Use when a warning is a false positive or unfixable in legacy code. Document the reason. **Compiler-specific warnings:** Different compilers (GCC, Clang) have different warnings. For maximum portability: ```bash gcc -Wall -Wextra -Wpedantic clang -Wall -Wextra -Wpedantic -Weverything # Clang is stricter ``` Clang has more warnings by default. Code that compiles cleanly with both is more portable. **Example catch:** Uninitialized variable: ```c int x; // uninitialized printf("%d", x); // -Wuninitialized warns about this ``` Without warnings, this is undefined behavior—the program reads garbage. With warnings, the compiler catches it immediately. **Build setup:** Add warnings to your Makefile or build system: ```makefile CFLAGS = -Wall -Wextra -Wpedantic -Werror -O3 -g ``` This ensures every compilation runs with consistent warning levels. Over time, you'll fix issues and the codebase becomes cleaner.