Re: [PATCH 1/5] git-compat-util: add isblank() and isgraph()
- From
Masahiro Yamada <masahiroy@kernel.org>
- Date
- Feb 10, 2023, 19:25 UTC
- Message-ID
- <CAK7LNAQM6tGmZvy9jVWy099dsOte_=P-Ro3CuAqAc5akiakyoQ@mail.gmail.com>
- In-Reply-To
- <xmqqo7q1ibek.fsf@gitster.g>
On Sat, Feb 11, 2023 at 4:11 AM Junio C Hamano <gitster@pobox.com> wrote:
Show 9 quoted lines
> > Masahiro Yamada <masahiroy@kernel.org> writes: > > > Use them with care because they are not robust against the pointer > > increment, like isblank(*s++). > > > > The same issue already exists for isspace(). > > Does it?
Sorry, I meant:
"The same issue already exists for isprint()"
#define isprint(x) ((x) >= 0x20 && (x) <= 0x7e)
is not robust against pointer increment.
Show 23 quoted lines
> > > #define sane_istest(x,mask) ((sane_ctype[(unsigned char)(x)] & (mask)) != 0) > > #define isascii(x) (((x) & ~0x7f) == 0) > > #define isspace(x) sane_istest(x,GIT_SPACE) > > sane_istest() evaluates x and mask only once, and isspace evaluates > x only once, no? > > isspace(*x++) > -> > sane_istest(*x++,GIT_SPACE) > -> > ((sane_ctype[(unsigned char)(*x++)] & GIT_SPACE) != 0) > > > +#define isblank(x) (isspace(x) || (x) == '\t') > > +#define isgraph(x) (isprint(x) && !isspace(x)) > > Given that all the other tests are implemented with just picking an > integer from the table and checking bit(s), the above two look > somewhat out of place. The fact, as you noted, that they cannot be > used safely does not help, either. > >
At first, I hesitated to move these to git-compat-util.h for this reason, but I noticed isprint() was in the same situation.
So, I decided to go.
-- Best Regards Masahiro Yamada