diff mbox

[libiberty] : Avoid 'right-hand operand of comma expression has no effect' when compiling regex.c

Message ID CAFULd4YHE2++2ZJAg2+gxdT8tso=-4ha3VsGLYhaB3TBLoCXxg@mail.gmail.com
State New
Headers show

Commit Message

Uros Bizjak March 13, 2014, 10:36 a.m. UTC
Hello!

When compiling regex.c from libiberty, several warnings are emitted:

../../gcc-svn/trunk/libiberty/regex.c: In function 'byte_regex_compile':
../../gcc-svn/trunk/libiberty/regex.c:154:47: warning: right-hand
operand of comma expression has no effect [-Wunused-value]
 #      define bzero(s, n) (memset (s, '\0', n), (s))
                                               ^
../../gcc-svn/trunk/libiberty/regex.c:3126:13: note: in expansion of
macro 'bzero'
             bzero (b, (1 << BYTEWIDTH) / BYTEWIDTH);
             ^

Attached patch changes the return value of the bzero macro to void, as
defined in a 4.3BSD:

       void bzero(void *s, size_t n);

As an additional benefit, the changed macro now generates warning when
its return value is used (which is *not* the case in regex.c):

--cut here--
int *arr;

#      define bzero(s, n) (memset (s, '\0', n), (void) 0)

void test (void)
{
  void *t = bzero (arr, 10000);
  (void) t;
}
--cut here--

gcc -O2 -Wall

bz.c: In function 'test':
bz.c:7:27: error: void value not ignored as it ought to be
 #      define bzero(s, n) (memset (s, '\0', n), (void) 0)
                           ^
bz.c:11:13: note: in expansion of macro 'bzero'
   void *t = bzero (arr, 10000);
             ^

2014-03-13  Uros Bizjak  <ubizjak@gmail.com>

    * regex.c (bzero) [!_LIBC]: Change return value to void.

Patch was bootstrapped and regression tested on x86_64-pc-linux-gnu.

OK for mainline (and release branches, perhaps)?

Uros.

Comments

Ian Lance Taylor March 13, 2014, 5:30 p.m. UTC | #1
On Thu, Mar 13, 2014 at 3:36 AM, Uros Bizjak <ubizjak@gmail.com> wrote:
>
> Attached patch changes the return value of the bzero macro to void, as
> defined in a 4.3BSD:
>
>        void bzero(void *s, size_t n);
>
> As an additional benefit, the changed macro now generates warning when
> its return value is used (which is *not* the case in regex.c):

I'm not worried about anybody using the return value incorrectly in
this file.  I think we should just

#      define bzero(s, n)	memset (s, '\0', n)

I'll approve that change if it works.

Ian
Pedro Alves March 13, 2014, 9:24 p.m. UTC | #2
On 03/13/2014 10:36 AM, Uros Bizjak wrote:
> +#      define bzero(s, n)	(memset (s, '\0', n), (void) 0)

AFAICS, the comma operator was only needed because of the
intention to return 's'.  If 's' is not be returned, then simply

 #      define bzero(s, n)	((void) memset (s, '\0', n))

should work.
Uros Bizjak March 13, 2014, 9:33 p.m. UTC | #3
On Thu, Mar 13, 2014 at 10:24 PM, Pedro Alves <palves@redhat.com> wrote:
> On 03/13/2014 10:36 AM, Uros Bizjak wrote:
>> +#      define bzero(s, n)    (memset (s, '\0', n), (void) 0)
>
> AFAICS, the comma operator was only needed because of the
> intention to return 's'.  If 's' is not be returned, then simply
>
>  #      define bzero(s, n)      ((void) memset (s, '\0', n))
>
> should work.

I think that adding (void) is the best solution. I'll commit this
version as soon as bootstrap ends.

Thanks,
Uros.
diff mbox

Patch

Index: regex.c
===================================================================
--- regex.c	(revision 208529)
+++ regex.c	(working copy)
@@ -151,7 +151,7 @@  char *realloc ();
 #    include <string.h>
 #    ifndef bzero
 #     ifndef _LIBC
-#      define bzero(s, n)	(memset (s, '\0', n), (s))
+#      define bzero(s, n)	(memset (s, '\0', n), (void) 0)
 #     else
 #      define bzero(s, n)	__bzero (s, n)
 #     endif