As any other Free Software developer, I think I have a love/hate relationship with the GNU Compiler Collection or, as it’s most commonly called, GCC. While GCC is a very good modern compiler, with tons of features, warning heuristics and very good optimisations, it’s very slow, and it’s not exactly foolproof when it comes to warnings.
In particular, I already wrote a couple of time that I dislike very much the way GCC cannot identify value sets but never used even though it should be trivial to do during SSA (and indeed the variables are not emitted in the final code), but it’s not just that.
Starting from version 4.3, GCC added a new support for warnings, the -Werror=
option; with earlier versions you could turn every warning into an error with -Werror
, or you had a couple of cases for -Werror-implicit-declaration
for instance. With -Werror=
you can set a specific class of warnings as being errors, and not turn the rest into errors. This is very good since some warnings like -Wreturn-types
are very truly errors, rather than just warnings, and it’s indeed a good idea to stop the build if they are raised.
So -Werror=
is good, and I started using it in more than a couple of my projects, to make sure that code is not injected that could break something. On the other hand, -Werror=
requires that you know the name of the -W
flag that enables a given warning. It’s very easy to do by using -fdiagnostics-show-option
:
% gcc -x c -Wall -Wextra -fdiagnostics-show-option -c -o /dev/null - < In function ‘foo':
:2: warning: control reaches end of non-void function [-Wreturn-type]
Cool, now we know that to turn that warning into error we have to pass -Werror=return-type
. Now this should be enough to turn any warning into errors, you’d think, but it’s unfortunately not the case. Take for instance the following case:
% gcc -x c -fdiagnostics-show-option -o /dev/null -c - <: In function ‘foo':
:2: warning: return makes integer from pointer without a cast
Code language: PHP (php)
You can notice here two particular things, the first is the obvious one, that gcc
is not reporting a warning option near the warning itself, which disallows us to use -Werror=
and the other that I didn’t pass any -W
flag to enable the warning. This is one of the warnings that are considered most important to gcc, so important that they are always enabled even when developers and users don’t go around asking for them, so important that the only way to disable it is to pass the -w
flag to disable all warnings, as there is no -Wno-
flag that disables them. But for these very same reasons, it is not possible to turn them into errors!
As you might guess is a paradoxical situation: the most important, most useful warnings (that most likely mean trouble) cannot be turned into errors because there is no way to disable them. And yet, there seems to be no development on this side, at least judging from the bug I reported .
Sometimes I find GCC is funny…
thanks for the article !!! I had the same problem as well. I was looking for a method how to set some warnings about incompatible pointer type into errors and couldn’t find any solution. Implicit pointer casting can cause lots of troubles. Now I know it is impossible to turn it into an error. It’s stupid, has to be definitely changed in GCC.