Re: "left shift of negative value" warnings

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: Andres Freund <andres(at)anarazel(dot)de>
Cc: pgsql-hackers(at)postgresql(dot)org
Subject: Re: "left shift of negative value" warnings
Date: 2017-04-09 23:20:27
Message-ID: 324.1491780027@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Andres Freund <andres(at)anarazel(dot)de> writes:
> For a while I've been getting warnings like
> /home/andres/src/postgresql/src/backend/utils/adt/inet_cidr_ntop.c: In function ‘inet_cidr_ntop_ipv6’:
> /home/andres/src/postgresql/src/backend/utils/adt/inet_cidr_ntop.c:205:11: warning: left shift of negative value [-Wshift-negative-value]
> m = ~0 << (8 - b);
> ^~

I imagine forcing the LHS to unsigned would silence that, though you'd
have to be careful that the sign extension (widening) happened before
you changed the value to unsigned, in the int64 cases. It's a bit odd
though that it seems to think ~0 is signed.

> If I understand C99 correctly, the behaviour of a left-shift of a
> negative number is undefined (6.5.7 4.).

As I read that, it's only "undefined" if overflow would occur (ie
the sign bit would change). Your compiler is being a useless annoying
nanny, but that seems to be the in thing for compiler authors these
days.

regards, tom lane

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Tatsuo Ishii 2017-04-09 23:32:19 Re: pgbench - allow to store select results into variables
Previous Message Noah Misch 2017-04-09 23:19:45 Re: SCRAM authentication, take three