|
|
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.