Messages in this thread |  | | From | Sergei Organov <> | Subject | Re: somebody dropped a (warning) bomb | Date | Mon, 19 Feb 2007 15:17:03 +0300 |
| |
Bodo Eggert <7eggert@gmx.de> writes: > On Fri, 16 Feb 2007, Sergei Organov wrote:
[...]
> I'll say it again: Either the code using unspecified chars is correct, or > it isn't. If it's correct, neither using with signed nor with unsigned > chars is a bug and you should not warn at all, and if it's not correct, > you should always warn. Instead, gcc warns on "code compiles for > $arch".
Here is where we disagree. In my opinion, no matter what the sign of char for given architecture is, it's incorrect to pass either "signed char*" or "unsigned char*" argument to a function expecting "char*".
>> > Therefore it's either always wrong to call your char* function with char*, >> > unsigned char* _and_ signed char unless you can guarantee not to overflow any >> > of them, or it's always correct to call char* functions with any kind >> > of these. >> >> How are you sure those who wrote foo(char*) agrees with your opinion or >> even understands all the involved issues? > > Let's asume we have this piece of buggy code. We compile it on an unsigned > char architecture. No warning. *BOOM*
There should be warning, -- that's my point. "char" is different. "char" is distinct from either "signed char" or "unsigned char". Always. At least it's how C is defined.
> Let's asume there is correct code, and we use it as designed: > Warning: Wrong arch > Warning: Wrong arch > Warning: Wrong arch > Warning: real issue > Warning: Wrong arch > Warning: Wrong arch > Warning: Wrong arch > Warning: Wrong arch > <scroll off screen/> > Warning: Wrong arch > Warning: Wrong arch > Warning: Wrong arch > Warning: Wrong arch > Warning: Wrong arch > > You don't see "real issue". *BOOM* > > > What can you do about this warning? Let's asume we cast everywhere:
I already gave an answer in response to Linus:
static inline size_t ustrlen(const unsigned char *s) { return strlen((const char *)s); }
> > struct foo * p; > printf(strlen(char*)p); *BOOM*
printf(ustrlen(p)); *NO BOOM* unsigned char* u; printf(ustrlen(u)); *NO WARNING*
-- Sergei. - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
|  |