This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
RFC: Walways-true considered harmful
- From: "Manuel López-Ibáñez" <lopezibanez at gmail dot com>
- To: gcc <gcc at gcc dot gnu dot org>
- Date: Sat, 13 Jan 2007 04:08:18 +0000
- Subject: RFC: Walways-true considered harmful
The option Walways-true is described as:
Warn about comparisons which are always true such as testing if
unsigned values are greater than or equal to zero. This warning is
enabled by -Wall.
In the description of warnings emitted by -Wextra we can find:
An unsigned value is compared against zero with < or >=.
GCC also emits an unconditional and unnamed warning that says:
"comparison is always true/false due to limited range of data type"
In this mail I will argue AGAINST adding the two latter warnings to
Walways-true.
The origins of Walways-true can be traced to a mail from Andrew Morton
[1]. Kernel devs hit a bug where a function's name has been used in a
test instead of actually calling the function. C++ front-end had a
warning for this with the following message "the address of
`function', will always be `true'". The warning was added to the C
front-end without an option to control it [2].
Much later, the warning was given a name, Walways-true [3], since the
warning message said explicitly that something will always be true.
However, Andrew Morton didn't want to get a warning just because the
expression was always true. He wanted to be warned of using the
address of a function where it makes more sense to call the function.
This seems also to be the original intent of the warning in the C++
front-end, as evidenced by the comment that accompanied it:
/* Common Ada/Pascal programmer's mistake. We always warn
about this since it is so bad. */
The common mistake is that in Ada/Pascal you can call a function just
by using its name (without parenthesis), while in C/C++ the name of a
function is its address. Yes, "if (func)" is always true and "if (func
== NULL)" is always false but that is not why Andrew Morton wants to
get the warning. Simply because a warning indicates that something is
bad coding, we should not put it under -Wbad-code. Not understanding
what GCC users really want [*] has led to the current situation.
The present. We want to give a name to the warnings above. From its
description, Walways-true, which seems to be useful for kernel devs
and it is enabled by -Wall, seems appropriate.
On the other hand, the -Wextra warning is in -Wextra for a reason: it
is hard to avoid for macros and templates. Moreover, it is one of the
reasons why the kernel is not built with -Wextra [4]. The other
warning is equally hard to avoid for macros and templates. We have two
bug reports about this [5][6]. Enabling those warnings with -Wall
doesn't seem to me to be a good idea. But, for the reasons exposed
above, moving Walways-true to Wextra and adding the warnings to it
would also be a mistake from my point of view.
Instead, I grouped both unnamed warnings under a different new option,
Wcomparison-fixed, which is only enabled by Wextra. The patch is
available at http://gcc.gnu.org/ml/gcc-patches/2007-01/msg01120.html
Sincerely,
Manuel.
[*] I don't say it is easy and I don't say I am right. I haven't
spoken with Andrew. Perhaps we should simply ask in linux-kernel. I am
just trying to raise awareness about a potential problem. The lazy and
easy way would be for me to add the warnings to Walways-true and get
the patch accepted.
[1] http://gcc.gnu.org/ml/gcc/2003-10/msg00414.html
[2] http://gcc.gnu.org/ml/gcc/2003-10/msg00419.html
[3] http://gcc.gnu.org/ml/gcc-patches/2005-12/msg00972.html
[4] http://lkml.org/lkml/2006/11/28/206
[5] http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12963
[6] http://gcc.gnu.org/bugzilla/show_bug.cgi?id=11856