Here are mine:
-Wextra
,-Wall
: essential.-Wfloat-equal
: useful because usually testing floating-point numbers for equality is bad.-Wundef
: warn if an uninitialized identifier is evaluated in an#if
directive.-Wshadow
: warn whenever a local variable shadows another local variable, parameter or global variable or whenever a built-in function is shadowed.-Wpointer-arith
: warn if anything depends upon the size of a function or ofvoid
.-Wcast-align
: warn whenever a pointer is cast such that the required alignment of the target is increased. For example, warn if achar *
is cast to anint *
on machines where integers can only be accessed at two- or four-byte boundaries.-Wstrict-prototypes
: warn if a function is declared or defined without specifying the argument types.-Wstrict-overflow=5
: warns about cases where the compiler optimizes based on the assumption that signed overflow does not occur. (The value 5 may be too strict, see the manual page.)-Wwrite-strings
: give string constants the typeconst char[
length]
so that copying the address of one into a non-const char *
pointer will get a warning.-Waggregate-return
: warn if any functions that return structures or unions are defined or called.-Wcast-qual
: warn whenever a pointer is cast to remove a type qualifier from the target type*.-Wswitch-default
: warn whenever aswitch
statement does not have adefault
case*.-Wswitch-enum
: warn whenever aswitch
statement has an index of enumerated type and lacks acase
for one or more of the named codes of that enumeration*.-Wconversion
: warn for implicit conversions that may alter a value*.-Wunreachable-code
: warn if the compiler detects that code will never be executed*.
Those marked * sometimes give too many spurious warnings, so I use them on as-needed basis.