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

stewart at seismo.UUCP stewart at seismo.UUCP
Thu May 24 03:08:06 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 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");



More information about the Comp.unix.wizards mailing list