Bodo Eggert <[EMAIL PROTECTED]> 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 [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/