tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: using the interfaces in ctype.h




On 21-Apr-08, at 11:32 AM, Joerg Sonnenberger wrote:
A simple mask just hides the problem and makes it even worse.

No, not really. The warning is only possible for one case that's nowhere near the majority of cases in my experience. The warning doesn't work for any variable defined as "int" or "long" or even "signed char" (though of course the latter will always be in range of the defined _ctype_ array object).

Now values
outside the allowed range will turn into silent wrong numbers.

Well, yes, but that's well within the right of the implementation as per the relevant standards. In any case it's safer than allowing out- of-bounds array accesses (which at best will also silently return the wrong values).

We could change the expression to be more careful using the "?:" operator instead of a mask perhaps, but I'm not sure of the runtime cost. It might be better to go with inline functions instead in that case. I think the mask is generally the most efficient operation on all NetBSD supported architectures if the goal is simply to ensure the array access is kept in bounds.

This is absolutely the wrong approach to the problem. As soon as you
consider non-ASCII charsets, mapping EOF to 255 will return *wrong*
values.

Actually, no, it doesn't, at least on NetBSD.   Try it!  :-)

(Non-ASCII charsets have no relevance w.r.t. the macro versions of the basic "ctype" APIs in NetBSD, which are the ones I'm suggesting need some form of protection to ensure out-of-bounds array accesses do not happen.)

--
                                        Greg A. Woods; Planix, Inc.
                                        <woods%planix.ca@localhost>



Home | Main Index | Thread Index | Old Index