David Holland <dholland-pkgtech%netbsd.org@localhost> writes:
> On Thu, Jun 23, 2022 at 03:51:31PM +0200, Havard Eidnes wrote:
> > it seems I've come across a compiler bug on NetBSD/powerpc
> > -current;
>
> Nope, it's UB in the source :-(
>
> > Building the tool "lemon" with debugging reveals inside
> > print_stack_union() around line 3071:
> >
> > hash = (hash & 0x7fffffff)%arraysize;
> > while( types[hash] ){
>
> Since hash is an int, that & is only defined if the sign bit is
> already clear, so it's a nop, and by the prevailing logic used by
> compilers these days, it can be dropped. Then you get a negative
> result out of the mod.
>
> Dunno why this doesn't break on every platform, but it's not exactly
> uncommon for gcc's behavior to be machine-specific for no good reason.
>
> Anyway, I'd patch it to
>
> - hash = (hash & 0x7fffffff)%arraysize;
> + hash = ((unsigned)hash & 0x7fffffff)%arraysize;
Thanks for explaining that. This patch certainly can just go in immediately.
> although building the tool without optimization might also be a good
> idea as when there's one problem like this there's likely more.
That's an interesting concept, and probably deserves a longer discussion
with its own thread. (I see it as a slippery slope that ends with not
optimizing any file in any program in which a UB bug has previously been
found, which is pretty much any program.)
I'd rather us not head down this path in the waning days of the freeze
period.
Attachment:
signature.asc
Description: PGP signature