Re: [HACKERS] "left shift of negative value" warnings
От | Andres Freund |
---|---|
Тема | Re: [HACKERS] "left shift of negative value" warnings |
Дата | |
Msg-id | 20170410201928.jjto2t4rqhi4hdz2@alap3.anarazel.de обсуждение исходный текст |
Ответ на | Re: [HACKERS] "left shift of negative value" warnings (Tom Lane <tgl@sss.pgh.pa.us>) |
Список | pgsql-hackers |
On 2017-04-10 15:25:57 -0400, Tom Lane wrote: > Andres Freund <andres@anarazel.de> writes: > > On 2017-04-09 19:20:27 -0400, Tom Lane wrote: > >> 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. > > > "The result of E1 << E2 is E1 left-shifted E2 bit positions; vacated bits are filled with > > zeros. If E1 has an unsigned type, the value of the result is E1 × 2 E2 , reduced modulo > > one more than the maximum value representable in the result type. If E1 has a signed > > type and nonnegative value, and E1 × 2 E2 is representable in the result type, then that is > > the resulting value; otherwise, the behavior is undefined." > > > As I read this it's defined iff E1 is signed, nonnegative *and* the the > > result of the shift is representable in the relevant type. That seems, > > uh, a bit restrictive, but that seems to be the only reading? > > Oh --- I misread the "nonnegative" as applying to the shift count, but > you're right, it's talking about the LHS. That's weird --- the E1 × 2^E2 > definition works fine as long as there's no overflow, so why didn't they > define it like that? It seems just arbitrarily broken this way. I guess the motivation is that it's not entirely clear what happens with the sign bit, when shifting. Why they made that UB instead of implementation defined, is a complete mystery to me, however. We should do *something* about this? The warnings are a bit annoying :( - Andres
В списке pgsql-hackers по дате отправления: