Jim Meyering wrote:
> static int
> tstbit (unsigned int b, charclass const c)
> {
> - return c[b / INTBITS] & 1 << b % INTBITS;
> + return c[b / INTBITS] & 1U << b % INTBITS;
> }
On a machine with 32-bit int and where b % INTBITS is 31,
the expression c[b / INTBITS] & 1U << b % INTBITS
is of type 'unsigned' and can have the value 2**31, and
this will overflow when tstbit converts that value as an int,
leading to implementation-defined behavior, which can include
raising a signal.
Better would be something like this:
static bool
tstbit (unsigned int b, charclass const c)
{
return c[b / INTBITS] >> b % INTBITS & 1;
}
and it'd probably be better to encourage this style in
other places where the problem occurs, e.g., quotearg.