[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [gpsd-dev] Warnings on 32 bit Fedora 24
From: |
Gary E. Miller |
Subject: |
Re: [gpsd-dev] Warnings on 32 bit Fedora 24 |
Date: |
Fri, 22 Jul 2016 16:29:20 -0700 |
Yo Greg!
Sounds like you almost have it sovled. Patches welcome!
On Fri, 22 Jul 2016 19:24:17 -0400
Greg Troxel <address@hidden> wrote:
> "Gary E. Miller" <address@hidden> writes:
>
> >> -DHAVE_SYS_TIMEPPS_H=1 bits.c bits.c: In function 'ubits':
> >> bits.c:40:19: warning: left shift of negative value
> >> [-Wshift-negative-value] fld &= ~(-1LL << width);
>
> I think the issue is that if you were to go read and understand the
> C99 standard, it would say that the left shift operator is only
> defined for unsigned or positive values.
>
> So the fix is probably to first figure out what it's supposed to be
> doing and write it without invoking undefined behavior.
>
> As I read that, if width is 8, you'd get
>
> 0xffffffff (from the -1LL)
> 0xffffff00 (from the <<)
> 0x000000ff (from the ~
>
> at least on platforms where long long is still 32 bits. (I would
> expect code to be written for fixed-width types, not native types
> anyway, but I haven't looked at this.) Basically "-1LL" is trying to
> be a constant with all the bits set, rather than a negative number,
> and is assuming that the machine uses 2s complement arithmetic, which
> while true on all computers I can remember using, is probably not
> actually required by the C99 standard.
>
> So, I would rewrite this as
>
> fld &= (1 << width) - 1
>
> except that this won't work for width 32. So instead this could be
>
> fld &= ~(~0ULL << width)
>
> I would definitely add an assert that the new/old ways are equal and
> run tests with it present before changing. This is tricky business!
>
RGDS
GARY
---------------------------------------------------------------------------
Gary E. Miller Rellim 109 NW Wilmington Ave., Suite E, Bend, OR 97703
address@hidden Tel:+1 541 382 8588
pgpJbQMx4EcRe.pgp
Description: OpenPGP digital signature