[gnu.utils.bug] magic numbers and portability

jgd@csd4.milw.wisc.edu (John G Dobnick,EMS E380,4142295727,) (04/06/89)

From article <8904040510.AA15711@thor.acc.stolaf.edu>, by mike@THOR.STOLAF.EDU (Mike Haertel):
> In the various binutil programs, reading just an int from the
> beginning of a file to get its magic number is idiotic.  What
> if the magic number isn't an int, or isn't right at the beginning?
> If the programs were properly written they would read a struct exec,
> rather than making a kludgy assumption about its internal format.

Concrete example time:

Assume the following architecture:  9-bit bytes.  (Yes Virginia, these
						   things *do* exist!)

				    int is 2 bytes (18 bits).

Now, assume a file is written on a machine with 8-bit bytes.  A *assumption*
is that two adjacent bytes (properly aligned) are equivalent to, and in 
fact *are*, an int (assuming 16-bit ints).  On a machine like this, one
can read a file, and be fairly assured that the first two characters (bytes)
in the file are *punning* an int.  Apparently considerable code makes
just this assumption.  However, this is *highly* non-portable code.

The actual example, taken from "real life":

        8-bit byte machine                     9-bit byte machine

 .-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.     .-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
 |7|6|5|4|3|2|1|0|7|6|5|4|3|2|1|0|     |x|7|6|5|4|3|2|1|0|x|7|6|5|4|3|2|1|0|
 `-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-'     `-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-'
 |               |               |     |                 |                 |
 |<--  Byte 1 -->|<-- Byte 2  -->|     |<--  Byte 1   -->|<--   Byte 2  -->|


Now, it is obvious that *assuming* a 16-bit int is equivalent to two
adjacent chars is not portable.  If it were, then

		7654321076543210  would be equivalent to
		x76543210x76543210, which is obviously not the case.

I have a machine that does exactly this (the 9-bit char case).
(Another issue, not mentioned here, is that on this machine
 0xff...ff != -1.   In fact, -1 == 0xff...fe.  Yes, that's one's
 compliment.)

The moral of this story, boys and girls, is 
	     "It's not (yet) a two's compliment, 8-bit world!"
or perhaps
	     "Portability is a bit more complicated than you think!"

-- 
John G Dobnick
Computing Services Division @ University of Wisconsin - Milwaukee
INTERNET: jgd@csd4.milw.wisc.edu
UUCP: <backbone>!uwvax!uwmcsd1!jgd

"Knowing how things work is the basis for appreciation,
and is thus a source of civilized delight."  -- William Safire