- publishing free software manuals
An Introduction to GCC - for the GNU compilers gcc and g++
by Brian J. Gough, foreword by Richard M. Stallman
Paperback (6"x9"), 144 pages
ISBN 0954161793
RRP £12.95 ($19.95)

"An excellent introduction... fills a much-needed niche in the marketplace" --- Association of C and C++ Users book review (Issue 16-4, August 2004) Get a printed copy>>>

6.7 Optimization and compiler warnings

When optimization is turned on, GCC can produce additional warnings that do not appear when compiling without optimization.

As part of the optimization process, the compiler examines the use of all variables and their initial values--this is referred to as data-flow analysis. It forms the basis for other optimization strategies, such as instruction scheduling. A side-effect of data-flow analysis is that the compiler can detect the use of uninitialized variables.

The -Wuninitialized option (which is included in -Wall) warns about variables that are read without being initialized. It only works when the program is compiled with optimization, so that data-flow analysis is enabled. The following function contains an example of such a variable:

int 
sign (int x)
{
  int s;
  
  if (x > 0)
    s = 1;
  else if (x < 0)
    s = -1;
  
  return s;
}

The function works correctly for most arguments, but has a bug when x is zero--in this case the return value of the variable s will be undefined.

Compiling the program with the -Wall option alone does not produce any warnings, because data-flow analysis is not carried out without optimization:

$ gcc -Wall -c uninit.c 

To produce a warning, the program must be compiled with -Wall and optimization simultaneously. In practice, the optimization level -O2 is needed to give good warnings:

$ gcc -Wall -O2 -c uninit.c 
uninit.c: In function `sign':
uninit.c:4: warning: `s' might be used uninitialized 
  in this function

This correctly detects the possibility of the variable s being used without being defined.

Note that while GCC will usually find most uninitialized variables, it does so using heuristics which will occasionally miss some complicated cases or falsely warn about others. In the latter situation, it is often possible to rewrite the relevant lines in a simpler way that removes the warning and improves the readability of the source code.

ISBN 0954161793An Introduction to GCC - for the GNU compilers gcc and g++See the print edition