From b5e4022c81a0e6e81db4f30cb7ac184dd025394f Mon Sep 17 00:00:00 2001 From: helly Date: Fri, 8 Apr 2005 19:45:35 +0000 Subject: [PATCH] - Fix [ 1163046 ] re2c hangs when processing valid re-file --- bootstrap/scanner.cc | 2 +- code.cc | 6 +- test/bug1163046.c | 302 +++++++++++++++++++++++++++++++++++++++++++ test/bug1163046.re | 46 +++++++ test/cnokw.c | 2 +- 5 files changed, 355 insertions(+), 3 deletions(-) create mode 100755 test/bug1163046.c create mode 100755 test/bug1163046.re diff --git a/bootstrap/scanner.cc b/bootstrap/scanner.cc index 450e9828..d70874db 100644 --- a/bootstrap/scanner.cc +++ b/bootstrap/scanner.cc @@ -1,4 +1,4 @@ -/* Generated by re2c 0.9.5.dev on Fri Apr 8 20:22:23 2005 */ +/* Generated by re2c 0.9.5.dev on Fri Apr 8 21:09:05 2005 */ #line 1 "scanner.re" /* $Id$ */ #include diff --git a/code.cc b/code.cc index 95a90312..0020fed3 100644 --- a/code.cc +++ b/code.cc @@ -875,7 +875,11 @@ uint maxDist(State *s) if (!t->link) { - m += maxDist(t); + if (t->depth == -1) + { + t->depth = maxDist(t); + } + m += t->depth; } if (m > mm) diff --git a/test/bug1163046.c b/test/bug1163046.c new file mode 100755 index 00000000..470304b1 --- /dev/null +++ b/test/bug1163046.c @@ -0,0 +1,302 @@ + +#line 1 "bug1163046.re" +#include + +#define YYCTYPE unsigned char +#define YYCURSOR cursor +#define YYLIMIT cursor +#define YYMARKER marker +#define YYFILL(n) + +bool scan(const char *text) +{ + YYCTYPE *start = (YYCTYPE *)text; + YYCTYPE *cursor = (YYCTYPE *)text; + YYCTYPE *marker = (YYCTYPE *)text; +next: + YYCTYPE *token = cursor; + +#line 6 "" +{ + YYCTYPE yych; + unsigned int yyaccept; + goto yy0; + ++YYCURSOR; +yy0: + if((YYLIMIT - YYCURSOR) < 45) YYFILL(45); + yych = *YYCURSOR; + switch(yych){ + case 0x00: goto yy5; + case '(': goto yy2; + default: goto yy4; + } +yy2: yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + switch(yych){ + case 'T': case 't': goto yy7; + default: goto yy3; + } +yy3: +#line 23 "bug1163046.re" +{ goto next; } +#line 29 "" +yy4: yych = *++YYCURSOR; + goto yy3; +yy5: ++YYCURSOR; + goto yy6; +yy6: +#line 25 "bug1163046.re" +{ return false; } +#line 37 "" +yy7: yych = *++YYCURSOR; + switch(yych){ + case 'H': case 'h': goto yy9; + default: goto yy8; + } +yy8: YYCURSOR = YYMARKER; + switch(yyaccept){ + case 0: goto yy3; + } +yy9: yych = *++YYCURSOR; + switch(yych){ + case 'I': case 'i': goto yy10; + default: goto yy8; + } +yy10: yych = *++YYCURSOR; + switch(yych){ + case 'S': case 's': goto yy11; + default: goto yy8; + } +yy11: yych = *++YYCURSOR; + switch(yych){ + case ' ': goto yy12; + default: goto yy8; + } +yy12: yych = *++YYCURSOR; + switch(yych){ + case 'F': case 'f': goto yy13; + default: goto yy8; + } +yy13: yych = *++YYCURSOR; + switch(yych){ + case 'I': case 'i': goto yy14; + default: goto yy8; + } +yy14: yych = *++YYCURSOR; + switch(yych){ + case 'L': case 'l': goto yy15; + default: goto yy8; + } +yy15: yych = *++YYCURSOR; + switch(yych){ + case 'E': case 'e': goto yy16; + default: goto yy8; + } +yy16: yych = *++YYCURSOR; + switch(yych){ + case ' ': goto yy17; + default: goto yy8; + } +yy17: yych = *++YYCURSOR; + switch(yych){ + case 'M': case 'm': goto yy18; + default: goto yy8; + } +yy18: yych = *++YYCURSOR; + switch(yych){ + case 'U': case 'u': goto yy19; + default: goto yy8; + } +yy19: yych = *++YYCURSOR; + switch(yych){ + case 'S': case 's': goto yy20; + default: goto yy8; + } +yy20: yych = *++YYCURSOR; + switch(yych){ + case 'T': case 't': goto yy21; + default: goto yy8; + } +yy21: yych = *++YYCURSOR; + switch(yych){ + case ' ': goto yy22; + default: goto yy8; + } +yy22: yych = *++YYCURSOR; + switch(yych){ + case 'B': case 'b': goto yy23; + default: goto yy8; + } +yy23: yych = *++YYCURSOR; + switch(yych){ + case 'E': case 'e': goto yy24; + default: goto yy8; + } +yy24: yych = *++YYCURSOR; + switch(yych){ + case ' ': goto yy25; + default: goto yy8; + } +yy25: yych = *++YYCURSOR; + switch(yych){ + case 'C': case 'c': goto yy26; + default: goto yy8; + } +yy26: yych = *++YYCURSOR; + switch(yych){ + case 'O': case 'o': goto yy27; + default: goto yy8; + } +yy27: yych = *++YYCURSOR; + switch(yych){ + case 'N': case 'n': goto yy28; + default: goto yy8; + } +yy28: yych = *++YYCURSOR; + switch(yych){ + case 'V': case 'v': goto yy29; + default: goto yy8; + } +yy29: yych = *++YYCURSOR; + switch(yych){ + case 'E': case 'e': goto yy30; + default: goto yy8; + } +yy30: yych = *++YYCURSOR; + switch(yych){ + case 'R': case 'r': goto yy31; + default: goto yy8; + } +yy31: yych = *++YYCURSOR; + switch(yych){ + case 'T': case 't': goto yy32; + default: goto yy8; + } +yy32: yych = *++YYCURSOR; + switch(yych){ + case 'E': case 'e': goto yy33; + default: goto yy8; + } +yy33: yych = *++YYCURSOR; + switch(yych){ + case 'D': case 'd': goto yy34; + default: goto yy8; + } +yy34: yych = *++YYCURSOR; + switch(yych){ + case ' ': goto yy35; + default: goto yy8; + } +yy35: yych = *++YYCURSOR; + switch(yych){ + case 'W': case 'w': goto yy36; + default: goto yy8; + } +yy36: yych = *++YYCURSOR; + switch(yych){ + case 'I': case 'i': goto yy37; + default: goto yy8; + } +yy37: yych = *++YYCURSOR; + switch(yych){ + case 'T': case 't': goto yy38; + default: goto yy8; + } +yy38: yych = *++YYCURSOR; + switch(yych){ + case 'H': case 'h': goto yy39; + default: goto yy8; + } +yy39: yych = *++YYCURSOR; + switch(yych){ + case ' ': goto yy40; + default: goto yy8; + } +yy40: yych = *++YYCURSOR; + switch(yych){ + case 'B': case 'b': goto yy41; + default: goto yy8; + } +yy41: yych = *++YYCURSOR; + switch(yych){ + case 'I': case 'i': goto yy42; + default: goto yy8; + } +yy42: yych = *++YYCURSOR; + switch(yych){ + case 'N': case 'n': goto yy43; + default: goto yy8; + } +yy43: yych = *++YYCURSOR; + switch(yych){ + case 'H': case 'h': goto yy44; + default: goto yy8; + } +yy44: yych = *++YYCURSOR; + switch(yych){ + case 'E': case 'e': goto yy45; + default: goto yy8; + } +yy45: yych = *++YYCURSOR; + switch(yych){ + case 'X': case 'x': goto yy46; + default: goto yy8; + } +yy46: yych = *++YYCURSOR; + switch(yych){ + case ' ': goto yy47; + default: goto yy8; + } +yy47: yych = *++YYCURSOR; + switch(yych){ + case '4': goto yy48; + default: goto yy8; + } +yy48: yych = *++YYCURSOR; + switch(yych){ + case '.': goto yy49; + default: goto yy8; + } +yy49: yych = *++YYCURSOR; + switch(yych){ + case '0': goto yy50; + default: goto yy8; + } +yy50: yych = *++YYCURSOR; + switch(yych){ + case ')': goto yy51; + default: goto yy8; + } +yy51: ++YYCURSOR; + goto yy52; +yy52: +#line 18 "bug1163046.re" +{ + if (token == start || *(token - 1) == '\n') + return true; else goto next; + } +#line 265 "" +} +#line 26 "bug1163046.re" + + return false; +} + +#define do_scan(str, expect) \ + res = scan(str) == expect ? 0 : 1; \ + std::cerr << str << "\t-\t" << (res ? "fail" : "ok") << std::endl; \ + result += res + +#define YYMAXFILL 45 + + +int main(int,void**) +{ + int res, result = 0; + do_scan("(This file must be converted with BinHex 4.0)", 1); + do_scan("x(This file must be converted with BinHex 4.0)", 0); + do_scan("(This file must be converted with BinHex 4.0)x", 1); + do_scan("x(This file must be converted with BinHex 4.0)x", 0); + + return result; +} diff --git a/test/bug1163046.re b/test/bug1163046.re new file mode 100755 index 00000000..fee9bd6c --- /dev/null +++ b/test/bug1163046.re @@ -0,0 +1,46 @@ +#include + +#define YYCTYPE unsigned char +#define YYCURSOR cursor +#define YYLIMIT cursor +#define YYMARKER marker +#define YYFILL(n) + +bool scan(const char *text) +{ + YYCTYPE *start = (YYCTYPE *)text; + YYCTYPE *cursor = (YYCTYPE *)text; + YYCTYPE *marker = (YYCTYPE *)text; +next: + YYCTYPE *token = cursor; +/*!re2c +'(This file must be converted with BinHex 4.0)' + { + if (token == start || *(token - 1) == '\n') + return true; else goto next; + } +[\001-\377] + { goto next; } +[\000] + { return false; } +*/ + return false; +} + +#define do_scan(str, expect) \ + res = scan(str) == expect ? 0 : 1; \ + std::cerr << str << "\t-\t" << (res ? "fail" : "ok") << std::endl; \ + result += res + +/*!max:re2c */ + +int main(int,void**) +{ + int res, result = 0; + do_scan("(This file must be converted with BinHex 4.0)", 1); + do_scan("x(This file must be converted with BinHex 4.0)", 0); + do_scan("(This file must be converted with BinHex 4.0)x", 1); + do_scan("x(This file must be converted with BinHex 4.0)x", 0); + + return result; +} diff --git a/test/cnokw.c b/test/cnokw.c index cf5e2215..20590ac4 100644 --- a/test/cnokw.c +++ b/test/cnokw.c @@ -133,7 +133,7 @@ std: goto yy0; ++YYCURSOR; yy0: - if((YYLIMIT - YYCURSOR) < 5) YYFILL(5); + if((YYLIMIT - YYCURSOR) < 4) YYFILL(4); yych = *YYCURSOR; switch(yych){ case 0x09: case 0x0B: -- 2.40.0