On Mon, Nov 18, 2013 at 6:16 PM, Paul Eggert <[email protected]> wrote: > 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.
Good point. "bool" is a better return type, too. I will adjust. Thanks, Paul.
