3.6.4.7 Wextra Option
The -Wextra
option generates extra warnings in the following
situations.
- 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 to
setjmp
. It cannot know wherelongjmp
will 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, becauselongjmp
cannot 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 asx[i,j]
causes a warning, butx[(void)i,j]
does not. - An unsigned value is compared against zero with
<
or<=
. - A comparison like
x<=y<=z
appears. This is equivalent to(x<=y ? 1 : 0) <= z
, which is a different interpretation from that of an ordinary mathematical notation. - Storage-class specifiers like
static
are not the first things in a declaration. According to the C Standard, this usage is obsolescent. - If
-Wall
or-Wunused
is 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 won’t warn if
-Wno-sign-compare
is 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.h
would be implicitly initialized to zero:struct s { int f, g, h; }; struct s x = { 3, 4 };