|
Message-ID: <CANv4PNkN6=MKEhcDf6bgQwSo_dSKFFhhr7ha_T8mKOVQU0DdJQ@mail.gmail.com> Date: Fri, 17 Apr 2015 22:03:53 -0400 From: Morten Welinder <mwelinder@...il.com> To: musl@...ts.openwall.com Subject: Re: Explicit casts in ctype.h suppress compiler warnings Ideally isspace and friends should also cause a warning if called with a "char" or "signed char" argument. Such calls are generally wrong unless the range of the argument can somehow be controlled. ("char" might be unsigned, for example.) The number of people who have no idea why they should not make such calls is astounding. The typical response is to blame the compiler and add an (int) cast. The search at https://searchcode.com/?q=isspace+%28int%29 claims ~55k instances. Ignore the first page which is finding isspace implementations, but incorrect uses. M. On Fri, Apr 17, 2015 at 5:36 PM, Rich Felker <dalias@...c.org> wrote: > On Fri, Apr 17, 2015 at 09:24:09PM +0300, Alexander Monakov wrote: >> > Do you have an idea in mind for how we could achieve that? I suspect >> > the macros are still better optimizable than the inline function >> > approach, so I'd lean towards doing a macro that avoids evaluating c >> > and just checks its type, which would involve using ?: I think. >> >> I admit I was thinking of doing isspace-style inlines everywhere, but thanks >> to your suggestion I was able to come up with this: >> >> static __inline void __is_int(int a) {} >> #define isdigit(a) (__is_int(0?(a):0), ((unsigned)(a)-'0') < 10) > > This still depends on the inline function getting honored, and puts > extra crap in the debug output. Instead, how about: > > #define isdigit(a) (0 ? (isdigit)(a) : ((unsigned)(a)-'0') < 10) > > Rich
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.