🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

2 total messages Started by stewart Wed, 23 May 1984 17:08
lex bug (v7, 2.8, 4.1, maybe others)
#207
Author: stewart
Date: Wed, 23 May 1984 17:08
51 lines
2124 bytes
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 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.

John Stewart

*** /usr/lib/lex/ncform	Wed May 23 10:13:30 1984
--- /usr/lib/lex/ncform.old	Thu Aug 11 23:51:26 1983
***************
*** 54,60
  				}
  # endif
  			yyr = yyt;
! 			if (yyt > yycrank){
  				yyt = yyr + yych;
  				if (yyt <= yytop && yyt->verify+yysvec == yystate){
  					if(yyt->advance+yysvec == YYLERR)	/* error transitions */

--- 54,60 -----
  				}
  # endif
  			yyr = yyt;
! 			if ( (int)yyt > (int)yycrank){
  				yyt = yyr + yych;
  				if (yyt <= yytop && yyt->verify+yysvec == yystate){
  					if(yyt->advance+yysvec == YYLERR)	/* error transitions */
***************
*** 64,70
  					}
  				}
  # ifdef YYOPTIM
! 			else if(yyt < yycrank) {		/* r < yycrank */
  				yyt = yyr = yycrank+(yycrank-yyt);
  # ifdef LEXDEBUG
  				if(debug)fprintf(yyout,"compressed state\n");

--- 64,70 -----
  					}
  				}
  # ifdef YYOPTIM
! 			else if((int)yyt < (int)yycrank) {		/* r < yycrank */
  				yyt = yyr = yycrank+(yycrank-yyt);
  # ifdef LEXDEBUG
  				if(debug)fprintf(yyout,"compressed state\n");
Re: lex bug (v7, 2.8, 4.1, maybe others)
#205
Author: Sam Kendall
Date: Thu, 24 May 1984 21:55
32 lines
2112 bytes
> 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
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads