Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
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.