6.6.4.3 The -W Option
Use the -W command line option to print extra warning
messages for these events:
- A nonvolatile automatic variable might be changed by a call to
longjmp. These warnings are possible only in optimizing compilation. The compiler sees only the calls tosetjmp. It cannot know wherelongjmpwill be called; in fact, a signal handler could call it at any point in the code. As a result, a warning may be generated even when there is in fact no problem, becauselongjmpcannot in fact be called at the place that would cause a problem. - A function could exit both via
return value;andreturn;. Completing the function body without passing any return statement is treated asreturn;. - An expression-statement or the left-hand side of a comma expression
contains no side effects. To suppress the warning, cast the unused expression to
void. For example, an expression such as
x[i,j]will cause a warning, butx[(void)i,j]will not. - An unsigned value is compared against zero with
<or<=. - A comparison like
x<=y<=zappears; this is equivalent to(x<=y ? 1 : 0) <= z, which is a different interpretation from that of ordinary mathematical notation. - Storage-class specifiers like
staticare not the first things in a declaration. According to the C Standard, this usage is obsolescent. - If
-Wallor-Wunusedis also specified, warn about unused arguments. - A comparison between signed and unsigned values could produce an
incorrect result when the signed value is converted to unsigned. (But don’t warn if
-Wno-sign-compareis also specified.) - An aggregate has a partly bracketed initializer. For example, the
following code would evoke such a warning, because braces are missing around the
initializer for
x.h:struct s { int f, g; }; struct t { struct s h; int i; }; struct t x = { 1, 2, 3 }; - An aggregate has an initializer that does not initialize all
members. For example, the following code would cause such a warning, because
x.hwould be implicitly initialized to zero:struct s { int f, g, h; };struct s x = { 3, 4 };
