Several of the -f
code generation options are interesting:
-
The
-ftrapv
function will cause the program to abort on signed integer overflow (formally "undefined behaviour" in C). -
-fverbose-asm
is useful if you're compiling with-S
to examine the assembly output - it adds some informative comments. -
-finstrument-functions
adds code to call user-supplied profiling functions at every function entry and exit point.
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.
-save-temps
This leaves behind the results of the preprocessor and the assembly.
The preprocessed source is useful for debugging macros.
The assembly is useful for determining what optimizations went into effect. For instance, you may want to verify that GCC is doing tail call optimization on some recursive functions, as without it you can potentially overflow the stack.
-