BUG(feature) in C-compiler

utzoo!decvax!harpo!floyd!whuxlb!eisx!npoiv!houxm!ihnp4!ihnet!tjr utzoo!decvax!harpo!floyd!whuxlb!eisx!npoiv!houxm!ihnp4!ihnet!tjr
Fri Apr 29 13:08:06 AEST 1983


Beware of an inconsistency in the UNIX 4.0 (etc.) C-compiler
and the basic reference manual for the C language:

	sizeof(object) is NOT "semantically an integer constant"
	[Kernighan and Ritchie, "The C Programming Language", p188].

	sizeof(object) appears to be an unsigned integer.

This is reasonable (especially on 16-bit machines), but can cause problems:
	
	In UNIX 5.0 message routines, msgrcv returns the number of bytes
	in the received message, or -1 to indicate an error. This does
	NOT work:
		if(msgrcv(...) >= sizeof(struct msg))
			handle_message();
	If msgrcv() detects an error (e.g. no message to read), its
	return-value of -1 is converted to unsigned int before the
	comparison, which will then always succeed! This works:
		if(msgrcv(...) >= (int)sizeof(struct msg))
			handle_message();

					Tom Roberts
					ihnet!tjr



More information about the Comp.unix.wizards mailing list