[vox-tech] gcc and quieting warnings

Ken Bloom kbloom at gmail.com
Sun Jun 4 08:30:36 PDT 2006


On Sunday 04 June 2006 08:29, Peter Jay Salzman wrote:
> On Sat 03 Jun 06, 10:56 PM, Ken Bloom <kbloom at gmail.com> said:
> > On Friday 02 June 2006 10:53, Peter Jay Salzman wrote:
> > > I always use -W -Wall when I compile code.  However, sometimes, I
> > > want gcc to ignore certain instances of a warning.  For example,
> > > in something like a stub function, or a signal callback, or even
> > > an API function that doesn't use all the parameters, like:
> > >
> > >    JNIEXPORT void JNICALL
> > >    Java_HelloWorld_print( JNIEnv *env, jobject obj )
> > >    {
> > >       printf("Hello World!\n");
> > >       return;
> > >    }
> > >
> > > gcc of course complains about unused parameters.  Of course, I
> > > *could* simply not use -W -Wall, but I don't want to NOT use -W
> > > -Wall just because I haven't gotten around to finishing a stub
> > > function. Besides, active development is the best time to turn on
> > > compiler warnings.
> > >
> > > I also assume there's a gcc -Wfno-unused-parameter (or something
> > > similar to this).  But again, I don't want to turn off the check
> > > for the entire program just because of one or two functions.
> > >
> > > In splint/lclint/lint, "annotations" are used to shut the checker
> > > up for cases where you don't want it to check a semantic.  I
> > > don't know the exact syntax, but it looks something like:
> > >
> > >    FILE *fp;
> > >    if ( (fp = fopen("foo", "r")) != NULL )
> > >       f( fp );
> > >    fclose( fp );  /* @NO NULL CHECK@ */
> > >
> > > and splint won't complain about the fact that fp may become
> > > uninitialized or corrupt after passing passing it to f().  The
> > > annotations are what make splint even remotely useful, otherwise
> > > I'd be reading warnings all day long.
> > >
> > > Does gcc have something similar?  Some way of telling the
> > > compiler to ignore a certain type of warning at a certain point
> > > in the code?
> > >
> > > I tried doing a search for "annotation" in the behemoth gcc info
> > > page, but no dice.  I wouldn't know what else to call it.
> >
> > What version of G++ are you using?
> >
> > [bloom at cat-in-the-hat ~]$ g++ --version
> > g++ (GCC) 4.0.4 20060507 (prerelease) (Debian 4.0.3-3)
> > Copyright (C) 2006 Free Software Foundation, Inc.
> > This is free software; see the source for copying conditions. 
> > There is NO
> > warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR
> > PURPOSE.
> >
> > [bloom at cat-in-the-hat ~]$ cat test.cpp
> > void foo(int a){
> >
> > }
> >
> > int main(){
> >    foo(1);
> >    return 0;
> > }
> > [bloom at cat-in-the-hat ~]$ g++ -Wall -o test test.cpp
> > [bloom at cat-in-the-hat ~]$ g++ -Wall -Wunused -o test test.cpp
> > [bloom at cat-in-the-hat ~]$ g++ -Wall -Wunused-parameter -o test
> > test.cpp test.cpp:1: warning: unused parameter ‘a’
> >
> > It seems that in g++ 4.0 -Wall implies -Wunused, which in turn
> > implies -Wunused-variable -Wunused-label -Wunused-function, but
> > does not imply -Wunused-parameter.
> >
> > --Ken
>
> p at satan$ cat foo.c
> void f(int env, int  obj)
> {
>    return;
> }
> p at satan$ gcc -c -W -Wall foo.c
> foo.c:1: warning: unused parameter ‘env’
> foo.c:1: warning: unused parameter ‘obj’
>
> tan$ gcc -v
> Using built-in specs.
> Target: i486-linux-gnu
> Configured with: ../src/configure -v
> --enable-languages=c,c++,java,f95,objc,ada,treelang --prefix=/usr
> --enable-shared --with-system-zlib --libexecdir=/usr/lib
> --without-included-gettext --enable-threads=posix --enable-nls
> --program-suffix=-4.0 --enable-__cxa_atexit --enable-clocale=gnu
> --enable-libstdcxx-debug --enable-java-awt=gtk-default
> --enable-gtk-cairo
> --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-4.0-1.4.2.0/jre
> --enable-mpfr --disable-werror --with-tune=i686
> --enable-checking=release i486-linux-gnu Thread model: posix
> gcc version 4.0.4 20060507 (prerelease) (Debian 4.0.3-3)

Your problem isn't -Wall. It's -W (now called -Wextra)

from the man page:
The following -W... options are not implied by -Wall.  Some of them
warn about constructions that users generally do not consider question-
able, but which occasionally you might wish to check for; others warn
about constructions that are necessary or hard to avoid in some cases,
and there is no simple way to modify the code to suppress the warning.

-Wextra
    (This option used to be called -W.  The older name is still sup-
    ported, but the newer name is more descriptive.)  Print extra warn-
    ing messages for these events:
[...]
    *   If -Wall or -Wunused is also specified, warn about unused argu-
	ments.
[...]

It seems to me that the following happens:
-Wextra alone doesn't warn you about unused parameters.
-Wall alone doesn't warn you about unused parameters.
-Wall -Wextra does warn you about unused parameters.

Sad thing is most of the other conditions that -Wextra -Wall give you 
seem to be worth checking for.

--Ken

-- 
I usually have a GPG digital signature included as an attachment.
See http://www.gnupg.org/ for info about these digital signatures.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
Url : http://ns1.livepenguin.com/pipermail/vox-tech/attachments/20060604/5941ec56/attachment.pgp


More information about the vox-tech mailing list