Date: Fri, 28 Aug 1998 13:38:11 +1000 From: Bruce Evans <bde@zeta.org.au> To: bde@zeta.org.au, jdp@polstra.com Cc: bugs@FreeBSD.ORG, dmm125@bellatlantic.net Subject: Re: error in libcompat (2.2.7) Message-ID: <199808280338.NAA22459@godzilla.zeta.org.au>
next in thread | raw e-mail | index | archive | help
>> Not a bug. The prototype must declare the arg as an int to match the >> old-style-but-still-ANSI definition. The definition uses char for >> historical reasons. Changing it would be incompatible. See rev.1.4 >> of ftok.3 for some notes about this. > >I don't agree. If the prototype says it's an int, then it should be >declared as int in the definition too. The definition should look >like this: > >key_t >ftok(path, id) > const char *path; > int id; >{ > struct stat st; > > if (stat(path, &st) < 0) > return (key_t)-1; > > return (key_t) ((char)id << 24 | (st.st_dev & 0xff) << 16 | (st.st_ino & 0xffff)); >} > >Here, I changed the type of "id" to int, and added a (char) cast in >front of its only use. This is just doing the compiler's work for it. The `char id' arg in the definition causes the `int id' arg in the prototype to be converted to a char on entry to the function, as if by assignment (ISO 6.7.1). Your cast is equivalent to such an assignment, modulo compiler optimizations, compiler warnings (compilers tend to warn more about assignments than casts) and style bugs. Bruce To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199808280338.NAA22459>