Date: Mon, 4 Dec 2000 01:20:04 -0800 (PST) From: Bill Fenner <fenner@research.att.com> To: freebsd-bugs@FreeBSD.org Subject: Re: bin/23254: yacc accepts bad grammer Message-ID: <200012040920.eB49K4o90201@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/23254; it has been noted by GNATS. From: Bill Fenner <fenner@research.att.com> To: freebsd-gnats-submit@freebsd.org, marka@nominum.com Cc: fenner@research.att.com Subject: Re: bin/23254: yacc accepts bad grammer Date: Mon, 4 Dec 2000 01:14:05 -0800 (PST) Ugh. Would you believe that yacc's scanner treats semicolons as whitespace? I wonder if semicolons were added to the input syntax "late" in the game (like in the mid'80's or so :-) ). This patch makes semicolons a little more explicitly part of yacc's input grammar; I'm sure I've missed something since I've been testing on a relatively unsophisticated grammar, but it's a start. It parses test/ftp.y and /usr/src/usr.sbin/mrouted/cfparse.y, at least, and gives a (nonsensical but at least some) error when I stick in bogus semicolons in various places. Bill cvs diff: Diffing . Index: reader.c =================================================================== RCS file: /home/ncvs/src/usr.bin/yacc/reader.c,v retrieving revision 1.6.2.1 diff -u -r1.6.2.1 reader.c --- reader.c 1999/08/29 15:35:09 1.6.2.1 +++ reader.c 2000/12/04 09:08:12 @@ -255,7 +255,6 @@ case '\r': case '\v': case ',': - case ';': ++s; break; @@ -551,7 +550,11 @@ goto loop; case '}': - if (--depth == 0) + if (--depth < 0) syntax_error(lineno, line, cptr); + goto loop; + + case ';': + if (depth == 0) { fprintf(text_file, " YYSTYPE;\n"); FREE(u_line); @@ -1198,6 +1201,8 @@ { register int i; + if (!plhs[nrules]) return; + if (!last_was_action && plhs[nrules]->tag) { for (i = nitems - 1; pitem[i]; --i) continue; @@ -1259,7 +1264,6 @@ c = nextc(); if (c == ':') { - end_rule(); start_rule(bp, s_lineno); ++cptr; return; @@ -1569,6 +1573,11 @@ else if (c == '%') { if (mark_symbol()) break; + } + else if (c == ';') + { + ++cptr; + end_rule(); } else syntax_error(lineno, line, cptr); cvs diff: Diffing test To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200012040920.eB49K4o90201>