Does check-in [077a6bee2d] resolve the issue below? http://www.sqlite.org/src/vinfo/077a6bee2d
Ron Wilson, Engineering Project Lead (o) 434.455.6453, (m) 434.851.1612, www.harris.com HARRIS CORPORATION | RF Communications Division assuredcommunications(tm) > -----Original Message----- > From: sqlite-users-boun...@sqlite.org [mailto:sqlite-users- > boun...@sqlite.org] On Behalf Of Vincent Zweije > Sent: Thursday, December 03, 2009 4:18 PM > To: sqlite-users@sqlite.org > Subject: Re: [sqlite] [bug+patch] Old lemon bug reintroduced > > > It seems my previous message has not gone through, so this is a repeat > post. > > A recent change to the lemon parser generator has reintroduced an old bug. > > The old bug report can be found in the debian bug tracking system: > http://bugs.debian.org/233690 > > The old bug was fixed in CVS checkin 1249: > http://www.sqlite.org/cvstrac/chngview?cn=1249 > > However, the bug was re-introduced in checkin 27d8e684db: > http://www.sqlite.org/src/info/27d8e684db > > Here is a demonstration of the bug with a small grammar, and a patch > that, at least for me now, appears to fix the bug in the same way as > the CVS checkin mentioned above. > > $fossil status > repository: /home/vincent/fossil/sqlite > local-root: /home/vincent/src/sqlite/ > server-code: 3efcb091a6d5857b29c9fa3385fee9ee4e8f866f > checkout: 2f42f91fe65b0b21671936013df08037091f0cc6 2009-11-20 > 18:48:36 UTC > parent: cae949ce971ca216e0f8880b2f93866619fa05be 2009-11-20 > 17:23:13 UTC > tags: trunk > $cat x.y > start ::= S0. > start ::= S1. > start ::= S2. > start ::= n0. > n0 ::= n4 T0. > n4 ::= . > n4 ::= n4 T4. > > %include{ > > #include <assert.h> > #include <stdlib.h> > #include "x.h" > > void *ParseAlloc(void*(*)(size_t)); > void ParseTrace(FILE*,char*); > void Parse(void*,int,void*); > void ParseFree(void*,void(*)(void*)); > > int main(int argc, char *argv[]) > { > void *parser = ParseAlloc(&malloc); > ParseTrace(stderr, "x: "); > Parse(parser, T0, NULL); > Parse(parser, 0, NULL); > ParseFree(parser, &free); > return 0; > } > > } > $gcc -o tool/lemon tool/lemon.c > $tool/lemon -s x.y > Parser statistics: 6 terminals, 4 nonterminals, 7 rules > 8 states, 0 parser table entries, 0 conflicts > $gcc -o x x.c > $./x > x: Input T0 > x: Shift 7 > x: Stack: T0 > x: Input $ > x: Reduce [n0 ::= n4 T0]. > x: x.c:524: yy_find_reduce_action: Assertion `stateno<=(0)' failed. > Aborted > $cat crash.patch > Index: tool/lemon.c > =================================================================== > fossil diff /home/vincent/src/sqlite/tool/lemon.c > --- tool/lemon.c > +++ tool/lemon.c > @@ -518,11 +518,11 @@ > ** offset is found. In the worst case, we fall out of the loop > when > ** i reaches p->nAction, which means we append the new transaction > set. > ** > ** i is the index in p->aAction[] where p->mnLookahead is inserted. > */ > - for(i=p->nAction-1; i>=0; i--){ > + for(i=p->nAction+p->mnLookahead-1; i>=0; i--){ > /* First look for an existing action table entry that can be > reused */ > if( p->aAction[i].lookahead==p->mnLookahead ){ > if( p->aAction[i].action!=p->mnAction ) continue; > for(j=0; j<p->nLookahead; j++){ > k = p->aLookahead[j].lookahead - p->mnLookahead + i; > @@ -541,11 +541,11 @@ > } > } > } > if( i<0 ){ > /* If no reusable entry is found, look for an empty slot */ > - for(i=0; i<p->nAction; i++){ > + for(i=0; i<p->nAction+p->mnLookahead; i++){ > if( p->aAction[i].lookahead<0 ){ > for(j=0; j<p->nLookahead; j++){ > k = p->aLookahead[j].lookahead - p->mnLookahead + i; > if( k<0 ) break; > if( p->aAction[k].lookahead>=0 ) break; > > $patch -p0 <crash.patch > patching file tool/lemon.c > $gcc -o tool/lemon tool/lemon.c > $tool/lemon -s x.y > Parser statistics: 6 terminals, 4 nonterminals, 7 rules > 8 states, 0 parser table entries, 0 conflicts > $gcc -o x x.c > $./x > x: Input T0 > x: Reduce [n4 ::=]. > x: Shift 1 > x: Stack: n4 > x: Shift 7 > x: Stack: n4 T0 > x: Input $ > x: Reduce [n0 ::= n4 T0]. > x: Shift 2 > x: Stack: n0 > x: Reduce [start ::= n0]. > x: Accept! > x: Popping $ > $ > > After night of bad sleep thinking, only the second hunk of this patch > seems necessary. > > The upper bound in the first hunk does not need to be increased, > because (as I understand) the loop looks to reuse an existing action > set. In fact, it may even be sharpened by only counting down from > nAction-(mxLookahead-mnLookahead)-1, because otherwise the new action > set falls off the end of the current action table anyway. > > I have not tested this... > > Ciao. Vincent. > -- > Vincent Zweije <zwe...@xs4all.nl> | "If you're flamed in a group you > <http://www.xs4all.nl/~zweije/> | don't read, does anybody get > burnt?" > [Xhost should be taken out and shot] | -- Paul Tomblin on > a.s.r. > _______________________________________________ > sqlite-users mailing list > sqlite-users@sqlite.org > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users