[PATCH] tile: Fix up corner cases with signed relocations

Rich Felker dalias@libc.org
Mon Sep 8 15:55:00 GMT 2014


On Mon, Sep 08, 2014 at 03:34:18PM +0000, Joseph S. Myers wrote:
> On Mon, 8 Sep 2014, Rich Felker wrote:
> 
> > > In any case, the GNU C language defines signed shifts (as long as the 
> > > shift amount is >= 0 and < width of type), although it may still be useful 
> > > to avoid the cases that are outside what ISO C defines.
> > 
> > I don't think this is true. For example, in many versions of GCC, this
> > is (rightfully!) an infinite loop:
> > 
> > 	int i;
> > 	for (i=1; i>0; i<<=1);
> 
> That would be a bug (I fixed such a bug ten years ago, PR 7284); please 
> report it if present in trunk.  Signed shifts are documented in 
> implement-c.texi; C90 makes some things implementation-defined even when 
> C99/C11 make them undefined.

OK, yet another reason to avoid << operator: GCC intentionally fails
to optimize it right. Thankfully *(1<<y) solves that too.

As for versions where the above loop condition gets optimized out, I
don't recall which ones, but I do recall seeing it (broken configure
scripts checking the range of time_t going into an infinite loop) in
the past 3 or 4 years. But it's very possible that the users who
experienced it were using a much older version of GCC such as 3.4,
4.2, or 4.4.

Rich



More information about the Libc-alpha mailing list