lex bug (v7, 2.8, 4.1, maybe others)

Sam Kendall kendall at wjh12.UUCP
Fri May 25 07:55:16 AEST 1984


> Lex versions:  version 7, Berkeley 2.8 and 4.1 (probably
> won't be visible on 32-bit machines, however).
>
> This bug is not in lex itself, but in [/usr/lib/lex/ncform,]
> the boilerplate lex pulls out of its library to make lex.yy.c.
> The original cast two pointers to type int before
> comparing them.  Needless to say, on our 16-bit int pdp11
> this causes errors when the addresses creep past 0x8000.
> I don't know why the casts were inserted, the pointers were
> the same type.

Mike Lesk gave me an explanation for the casts, which if I understood
correctly is as follows: yyt points to the array yycrank[] of size (say)
N.  The program wants to store an extra bit of information in those
pointers; it does so in a strange way, by subtracting N from the
pointer, so that it points to (imaginary) storage below the array.  The
test to see if the pointer points below the array should be just
	yyt < yycrank
(that the test is really a > is presumably an irrelevant detail).
Unfortunately, on some machines
	yyt - N
wraps around the address space, and tests as a very high pointer.  So
the pointers are cast to int, so that the comparison is signed, and very
high pointers test as less than yycrank.

A question to John Stewart: have these casts actually caused errors on
your PDP-11?  yycrank is an external array, and should be in low
memory, so that the problem of addresses past HIGH_ADDRESS/2 should not
occur.

	Sam Kendall	{allegra,ihnp4,ima,amd70}!wjh12!kendall
	Delft Consulting Corp.	    decvax!genrad!wjh12!kendall



More information about the Comp.unix.wizards mailing list