Thread: 2x compile warning

2x compile warning

From
Gevik Babakhani
Date:
I noticed the following compile warnings. Perhaps someone is interested
to know about them.

/usr/bin/flex  -o'pgc.c' pgc.l
gcc -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Winline
-Wdeclaration-after-statement -Wendif-labels -fno-strict-aliasing -g
-Wno-error  -I./../include -I. -I../../../../src/include -D_GNU_SOURCE
-DMAJOR_VERSION=4 -DMINOR_VERSION=2 -DPATCHLEVEL=1  -c -o preproc.o
preproc.c -MMD
In file included from preproc.y:6606:
pgc.c: In function ‘yylex’:
pgc.c:1549: warning: label ‘find_rule’ defined but not used

_GNU_SOURCE   -c -o mac.o mac.c -MMD
gcc -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Winline
-Wdeclaration-after-statement -Wendif-labels -fno-strict-aliasing -g
-I../../../../src/include -D_GNU_SOURCE   -c -o inet_net_ntop.o
inet_net_ntop.c -MMD
inet_net_ntop.c: In function ‘inet_cidr_ntop_ipv6’:
inet_net_ntop.c:292: warning: value computed is not used



Re: 2x compile warning

From
Kris Jurka
Date:

On Mon, 24 Apr 2006, Gevik Babakhani wrote:

> I noticed the following compile warnings. Perhaps someone is interested
> to know about them.

Also I was testing a gcc 4.2 snapshot (20060419) and it has a whole lot of 
warnings stemming from heap_getattr's isnull check:

aclchk.c:791: warning: the address of 'isNull', will always evaluate as 
'true'

aclDatum = heap_getattr(tuple, Anum_pg_database_datacl, 
RelationGetDescr(relation), &isNull);


#define heap_getattr(tup, attnum, tupleDesc, isnull) \
( \    AssertMacro((tup) != NULL), \    ( \        ((attnum) > 0) ? \        ( \            ((attnum) > (int)
(tup)->t_data->t_natts)? \            ( \                ((isnull) ? (*(isnull) = true) : (dummyret)NULL), \
   (Datum)NULL \            ) \            : \                fastgetattr((tup), (attnum), (tupleDesc), (isnull)) \
  ) \        : \            heap_getsysattr((tup), (attnum), (tupleDesc), (isnull)) \    ) \
 
)

Removing the check for (isnull) before (*(isnull) = true) as in the 
attached patch passes make check, but I have not looked at every 
heap_getattr call site to ensure it's passing a valid isnull pointer.

Kris Jurka

Re: 2x compile warning

From
Tom Lane
Date:
Kris Jurka <books@ejurka.com> writes:
> Also I was testing a gcc 4.2 snapshot (20060419) and it has a whole lot of 
> warnings stemming from heap_getattr's isnull check:
> aclchk.c:791: warning: the address of 'isNull', will always evaluate as 
> 'true'

We need to lobby the gcc maintainers to not give warnings about valid
and perfectly reasonable code.  I'm not thrilled with changing the API
of a key macro for no other reason than that gcc has started to complain
about it.
        regards, tom lane


Re: 2x compile warning

From
Bruce Momjian
Date:
Gevik Babakhani wrote:
> I noticed the following compile warnings. Perhaps someone is interested
> to know about them.
>
> /usr/bin/flex  -o'pgc.c' pgc.l
> gcc -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Winline
> -Wdeclaration-after-statement -Wendif-labels -fno-strict-aliasing -g
> -Wno-error  -I./../include -I. -I../../../../src/include -D_GNU_SOURCE
> -DMAJOR_VERSION=4 -DMINOR_VERSION=2 -DPATCHLEVEL=1  -c -o preproc.o
> preproc.c -MMD
> In file included from preproc.y:6606:
> pgc.c: In function ?yylex?:
> pgc.c:1549: warning: label ?find_rule? defined but not used

This is a standard warning generated by bison and we can't get rid of
it.

> _GNU_SOURCE   -c -o mac.o mac.c -MMD
> gcc -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Winline
> -Wdeclaration-after-statement -Wendif-labels -fno-strict-aliasing -g
> -I../../../../src/include -D_GNU_SOURCE   -c -o inet_net_ntop.o
> inet_net_ntop.c -MMD
> inet_net_ntop.c: In function ?inet_cidr_ntop_ipv6?:
> inet_net_ntop.c:292: warning: value computed is not used

I have fixed this by adding a (void) cast, patch attached.

--
  Bruce Momjian   http://candle.pha.pa.us
  EnterpriseDB    http://www.enterprisedb.com

  + If your life is a hard drive, Christ can be your backup. +
Index: src/backend/utils/adt/inet_net_ntop.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/utils/adt/inet_net_ntop.c,v
retrieving revision 1.21
diff -c -c -r1.21 inet_net_ntop.c
*** src/backend/utils/adt/inet_net_ntop.c    15 Oct 2005 02:49:28 -0000    1.21
--- src/backend/utils/adt/inet_net_ntop.c    24 Apr 2006 19:49:04 -0000
***************
*** 289,295 ****
          }
      }
      /* Format CIDR /width. */
!     SPRINTF((cp, "/%u", bits));
      if (strlen(outbuf) + 1 > size)
          goto emsgsize;
      strcpy(dst, outbuf);
--- 289,295 ----
          }
      }
      /* Format CIDR /width. */
!     (void) SPRINTF((cp, "/%u", bits));
      if (strlen(outbuf) + 1 > size)
          goto emsgsize;
      strcpy(dst, outbuf);

Re: 2x compile warning

From
Bruce Momjian
Date:
Tom Lane wrote:
> Kris Jurka <books@ejurka.com> writes:
> > Also I was testing a gcc 4.2 snapshot (20060419) and it has a whole lot of 
> > warnings stemming from heap_getattr's isnull check:
> > aclchk.c:791: warning: the address of 'isNull', will always evaluate as 
> > 'true'
> 
> We need to lobby the gcc maintainers to not give warnings about valid
> and perfectly reasonable code.  I'm not thrilled with changing the API
> of a key macro for no other reason than that gcc has started to complain
> about it.

Right.  The issue is that when I originally transfered that function to
a macro, the isnull parameter was optionally 0/NULL. While our code
doesn't use that ability, I see no reason to remove it.

I understand why it is complaining because you are really doing if
(&var), but it is a macro, so it can be used in other circumstances as
well.

--  Bruce Momjian   http://candle.pha.pa.us EnterpriseDB    http://www.enterprisedb.com
 + If your life is a hard drive, Christ can be your backup. +


Re: 2x compile warning

From
Martijn van Oosterhout
Date:
On Mon, Apr 24, 2006 at 01:16:04PM -0500, Kris Jurka wrote:
>
>
> On Mon, 24 Apr 2006, Gevik Babakhani wrote:
>
> >I noticed the following compile warnings. Perhaps someone is interested
> >to know about them.
>
> Also I was testing a gcc 4.2 snapshot (20060419) and it has a whole lot of
> warnings stemming from heap_getattr's isnull check:
>
> aclchk.c:791: warning: the address of 'isNull', will always evaluate as
> 'true'

Perhaps someone could check if changing the test explicitly check
against NULL:

>             ((attnum) > (int) (tup)->t_data->t_natts) ? \
>             ( \
>                 (((isnull) != NULL)? (*(isnull) = true) : (dummyret)NULL), \
>                 (Datum)NULL \

removes the warning. It seems silly for the GCC people to add warnings
for this kind of stuff without a simple way to bypass it...
--
Martijn van Oosterhout   <kleptog@svana.org>   http://svana.org/kleptog/
> From each according to his ability. To each according to his ability to litigate.

Re: 2x compile warning

From
Kris Jurka
Date:

On Mon, 24 Apr 2006, Martijn van Oosterhout wrote:

> Perhaps someone could check if changing the test explicitly check
> against NULL:
>
>>             ((attnum) > (int) (tup)->t_data->t_natts) ? \
>>             ( \
>>                 (((isnull) != NULL)? (*(isnull) = true) : (dummyret)NULL), \
>>                 (Datum)NULL \
>
> removes the warning. It seems silly for the GCC people to add warnings
> for this kind of stuff without a simple way to bypass it...

Yes, this coding removes the warning.

Kris Jurka



Re: 2x compile warning

From
Tom Lane
Date:
Kris Jurka <books@ejurka.com> writes:
> On Mon, 24 Apr 2006, Martijn van Oosterhout wrote:
>> Perhaps someone could check if changing the test explicitly check
>> against NULL:
>> 
>> ((attnum) > (int) (tup)->t_data->t_natts) ? \
>> ( \
>> (((isnull) != NULL)? (*(isnull) = true) : (dummyret)NULL), \
>> (Datum)NULL \
>> 
>> removes the warning. It seems silly for the GCC people to add warnings
>> for this kind of stuff without a simple way to bypass it...

> Yes, this coding removes the warning.

Oh, good, that seems like a reasonable change to make (it's arguably
more clear than the original anyway).

Is this the only place where the warning shows up?  ISTM there's quite
a lot of code that uses "if (ptr)" for a NULL-ness check.
        regards, tom lane


Re: 2x compile warning

From
Martijn van Oosterhout
Date:
On Mon, Apr 24, 2006 at 05:39:30PM -0400, Tom Lane wrote:
> > Yes, this coding removes the warning.
>
> Oh, good, that seems like a reasonable change to make (it's arguably
> more clear than the original anyway).
>
> Is this the only place where the warning shows up?  ISTM there's quite
> a lot of code that uses "if (ptr)" for a NULL-ness check.

But very little code of the form "if (&local_var)" which is always true
and what causes the problem here. I think this is just a variation on
the compiler test for "if (i=1)" which is also always true but probably
a bug. That warning you avoid with an extra set of parenthesis.

I'd be surprised if there were many other issues here, only complex
macros are likely to cause this one.

Have a nice day,
--
Martijn van Oosterhout   <kleptog@svana.org>   http://svana.org/kleptog/
> From each according to his ability. To each according to his ability to litigate.

Re: 2x compile warning

From
Bruce Momjian
Date:
Kris Jurka wrote:
>
>
> On Mon, 24 Apr 2006, Martijn van Oosterhout wrote:
>
> > Perhaps someone could check if changing the test explicitly check
> > against NULL:
> >
> >>             ((attnum) > (int) (tup)->t_data->t_natts) ? \
> >>             ( \
> >>                 (((isnull) != NULL)? (*(isnull) = true) : (dummyret)NULL), \
> >>                 (Datum)NULL \
> >
> > removes the warning. It seems silly for the GCC people to add warnings
> > for this kind of stuff without a simple way to bypass it...
>
> Yes, this coding removes the warning.

Great, fix attached and applied.

--
  Bruce Momjian   http://candle.pha.pa.us
  EnterpriseDB    http://www.enterprisedb.com

  + If your life is a hard drive, Christ can be your backup. +
Index: src/include/access/heapam.h
===================================================================
RCS file: /cvsroot/pgsql/src/include/access/heapam.h,v
retrieving revision 1.107
diff -c -c -r1.107 heapam.h
*** src/include/access/heapam.h    24 Mar 2006 04:32:13 -0000    1.107
--- src/include/access/heapam.h    24 Apr 2006 22:03:14 -0000
***************
*** 100,106 ****
          ( \
              ((attnum) > (int) (tup)->t_data->t_natts) ? \
              ( \
!                 ((isnull) ? (*(isnull) = true) : (dummyret)NULL), \
                  (Datum)NULL \
              ) \
              : \
--- 100,106 ----
          ( \
              ((attnum) > (int) (tup)->t_data->t_natts) ? \
              ( \
!                 ((isnull) != NULL) ? (*(isnull) = true) : (dummyret)NULL), \
                  (Datum)NULL \
              ) \
              : \

Re: 2x compile warning

From
Kris Jurka
Date:

On Mon, 24 Apr 2006, Bruce Momjian wrote:

> Great, fix attached and applied.
>

You also need to change lines 48 and 64 of heapam.h to use the same 
coding.

Kris Jurka


Re: 2x compile warning

From
Bruce Momjian
Date:
Kris Jurka wrote:
> 
> 
> On Mon, 24 Apr 2006, Bruce Momjian wrote:
> 
> > Great, fix attached and applied.
> >
> 
> You also need to change lines 48 and 64 of heapam.h to use the same 
> coding.

Done.

--  Bruce Momjian   http://candle.pha.pa.us EnterpriseDB    http://www.enterprisedb.com
 + If your life is a hard drive, Christ can be your backup. +