]> granicus.if.org Git - re2c/commitdiff
Fixed yet another out of bounds read in lexer due to not handling EOF after escape.
authorUlya Trofimovich <skvadrik@gmail.com>
Wed, 31 Oct 2018 23:15:28 +0000 (23:15 +0000)
committerUlya Trofimovich <skvadrik@gmail.com>
Wed, 31 Oct 2018 23:16:23 +0000 (23:16 +0000)
Found by american fuzzy lop (thanks to Henri Salo).

14 files changed:
re2c/bootstrap/src/ast/lex.cc
re2c/src/ast/lex.re
re2c/test/american_fuzzy_lop/001.c
re2c/test/american_fuzzy_lop/001.re
re2c/test/american_fuzzy_lop/002.c
re2c/test/american_fuzzy_lop/002.re
re2c/test/american_fuzzy_lop/003.c
re2c/test/american_fuzzy_lop/003.re
re2c/test/american_fuzzy_lop/004.c [new file with mode: 0644]
re2c/test/american_fuzzy_lop/004.re [new file with mode: 0644]
re2c/test/american_fuzzy_lop/005.c [new file with mode: 0644]
re2c/test/american_fuzzy_lop/005.re [new file with mode: 0644]
re2c/test/american_fuzzy_lop/006.c [new file with mode: 0644]
re2c/test/american_fuzzy_lop/006.re [new file with mode: 0644]

index 6c6f337c02d980751145285302818130aa35c4c8..2a4b4cd704920288c27dbd233487eee34d7c4eb4 100644 (file)
@@ -1,4 +1,4 @@
-/* Generated by re2c 1.1.1 on Tue Oct 30 22:03:15 2018 */
+/* Generated by re2c 1.1.1 on Wed Oct 31 22:58:25 2018 */
 #line 1 "../src/ast/lex.re"
 #include "src/util/c99_stdint.h"
 #include <stddef.h>
@@ -2184,266 +2184,279 @@ yy395:
        goto yy392;
 yy396:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= ']') {
-               if (yych <= '3') {
-                       if (yych <= '\r') {
+       if (yych <= '\\') {
+               if (yych <= '/') {
+                       if (yych <= '\f') {
+                               if (yych <= 0x00) goto yy397;
                                if (yych == '\n') goto yy393;
-                               if (yych >= '\r') goto yy399;
+                               goto yy398;
                        } else {
-                               if (yych == '-') goto yy400;
-                               if (yych >= '0') goto yy402;
+                               if (yych <= '\r') goto yy400;
+                               if (yych == '-') goto yy401;
+                               goto yy398;
                        }
                } else {
-                       if (yych <= 'W') {
-                               if (yych <= '7') goto yy404;
-                               if (yych == 'U') goto yy405;
+                       if (yych <= 'U') {
+                               if (yych <= '3') goto yy403;
+                               if (yych <= '7') goto yy405;
+                               if (yych <= 'T') goto yy398;
+                               goto yy406;
                        } else {
-                               if (yych <= 'X') goto yy407;
-                               if (yych <= '[') goto yy397;
-                               if (yych <= '\\') goto yy408;
-                               goto yy410;
+                               if (yych == 'X') goto yy408;
+                               if (yych <= '[') goto yy398;
+                               goto yy409;
                        }
                }
        } else {
-               if (yych <= 'q') {
-                       if (yych <= 'e') {
-                               if (yych <= '`') goto yy397;
-                               if (yych <= 'a') goto yy412;
-                               if (yych <= 'b') goto yy414;
+               if (yych <= 'n') {
+                       if (yych <= 'b') {
+                               if (yych <= ']') goto yy411;
+                               if (yych <= '`') goto yy398;
+                               if (yych <= 'a') goto yy413;
+                               goto yy415;
                        } else {
-                               if (yych <= 'f') goto yy416;
-                               if (yych == 'n') goto yy418;
+                               if (yych == 'f') goto yy417;
+                               if (yych <= 'm') goto yy398;
+                               goto yy419;
                        }
                } else {
-                       if (yych <= 'u') {
-                               if (yych <= 'r') goto yy420;
-                               if (yych <= 's') goto yy397;
-                               if (yych <= 't') goto yy422;
-                               goto yy407;
+                       if (yych <= 't') {
+                               if (yych == 'r') goto yy421;
+                               if (yych <= 's') goto yy398;
+                               goto yy423;
                        } else {
-                               if (yych <= 'v') goto yy424;
-                               if (yych == 'x') goto yy426;
+                               if (yych <= 'v') {
+                                       if (yych <= 'u') goto yy408;
+                                       goto yy425;
+                               } else {
+                                       if (yych == 'x') goto yy427;
+                                       goto yy398;
+                               }
                        }
                }
        }
 yy397:
-       ++YYCURSOR;
+#line 451 "../src/ast/lex.re"
+       { fatal_lc(l, c, "syntax error in escape sequence"); }
+#line 2242 "src/ast/lex.cc"
 yy398:
+       ++YYCURSOR;
+yy399:
 #line 466 "../src/ast/lex.re"
        {
             warn.useless_escape(cline, get_column(), tok[1]);
             return static_cast<uint8_t>(tok[1]);
         }
-#line 2238 "src/ast/lex.cc"
-yy399:
+#line 2251 "src/ast/lex.cc"
+yy400:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == '\n') goto yy393;
-       goto yy398;
-yy400:
+       goto yy399;
+yy401:
        ++YYCURSOR;
 #line 464 "../src/ast/lex.re"
        { return static_cast<uint8_t>('-'); }
-#line 2247 "src/ast/lex.cc"
-yy402:
+#line 2260 "src/ast/lex.cc"
+yy403:
        yyaccept = 0;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych <= '/') goto yy403;
-       if (yych <= '7') goto yy427;
-yy403:
+       if (yych <= '/') goto yy404;
+       if (yych <= '7') goto yy428;
+yy404:
 #line 450 "../src/ast/lex.re"
        { fatal_lc(l, c, "syntax error in octal escape sequence"); }
-#line 2256 "src/ast/lex.cc"
-yy404:
-       ++YYCURSOR;
-       goto yy403;
+#line 2269 "src/ast/lex.cc"
 yy405:
+       ++YYCURSOR;
+       goto yy404;
+yy406:
        yyaccept = 1;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yych <= '@') {
-               if (yych <= '/') goto yy406;
-               if (yych <= '9') goto yy429;
+               if (yych <= '/') goto yy407;
+               if (yych <= '9') goto yy430;
        } else {
-               if (yych <= 'F') goto yy429;
-               if (yych <= '`') goto yy406;
-               if (yych <= 'f') goto yy429;
+               if (yych <= 'F') goto yy430;
+               if (yych <= '`') goto yy407;
+               if (yych <= 'f') goto yy430;
        }
-yy406:
+yy407:
 #line 449 "../src/ast/lex.re"
        { fatal_lc(l, c, "syntax error in hexadecimal escape sequence"); }
-#line 2274 "src/ast/lex.cc"
-yy407:
+#line 2287 "src/ast/lex.cc"
+yy408:
        yyaccept = 1;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yych <= '@') {
-               if (yych <= '/') goto yy406;
-               if (yych <= '9') goto yy430;
-               goto yy406;
+               if (yych <= '/') goto yy407;
+               if (yych <= '9') goto yy431;
+               goto yy407;
        } else {
-               if (yych <= 'F') goto yy430;
-               if (yych <= '`') goto yy406;
-               if (yych <= 'f') goto yy430;
-               goto yy406;
+               if (yych <= 'F') goto yy431;
+               if (yych <= '`') goto yy407;
+               if (yych <= 'f') goto yy431;
+               goto yy407;
        }
-yy408:
+yy409:
        ++YYCURSOR;
 #line 463 "../src/ast/lex.re"
        { return static_cast<uint8_t>('\\'); }
-#line 2292 "src/ast/lex.cc"
-yy410:
+#line 2305 "src/ast/lex.cc"
+yy411:
        ++YYCURSOR;
 #line 465 "../src/ast/lex.re"
        { return static_cast<uint8_t>(']'); }
-#line 2297 "src/ast/lex.cc"
-yy412:
+#line 2310 "src/ast/lex.cc"
+yy413:
        ++YYCURSOR;
 #line 456 "../src/ast/lex.re"
        { return static_cast<uint8_t>('\a'); }
-#line 2302 "src/ast/lex.cc"
-yy414:
+#line 2315 "src/ast/lex.cc"
+yy415:
        ++YYCURSOR;
 #line 457 "../src/ast/lex.re"
        { return static_cast<uint8_t>('\b'); }
-#line 2307 "src/ast/lex.cc"
-yy416:
+#line 2320 "src/ast/lex.cc"
+yy417:
        ++YYCURSOR;
 #line 458 "../src/ast/lex.re"
        { return static_cast<uint8_t>('\f'); }
-#line 2312 "src/ast/lex.cc"
-yy418:
+#line 2325 "src/ast/lex.cc"
+yy419:
        ++YYCURSOR;
 #line 459 "../src/ast/lex.re"
        { return static_cast<uint8_t>('\n'); }
-#line 2317 "src/ast/lex.cc"
-yy420:
+#line 2330 "src/ast/lex.cc"
+yy421:
        ++YYCURSOR;
 #line 460 "../src/ast/lex.re"
        { return static_cast<uint8_t>('\r'); }
-#line 2322 "src/ast/lex.cc"
-yy422:
+#line 2335 "src/ast/lex.cc"
+yy423:
        ++YYCURSOR;
 #line 461 "../src/ast/lex.re"
        { return static_cast<uint8_t>('\t'); }
-#line 2327 "src/ast/lex.cc"
-yy424:
+#line 2340 "src/ast/lex.cc"
+yy425:
        ++YYCURSOR;
 #line 462 "../src/ast/lex.re"
        { return static_cast<uint8_t>('\v'); }
-#line 2332 "src/ast/lex.cc"
-yy426:
+#line 2345 "src/ast/lex.cc"
+yy427:
        yyaccept = 1;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yych <= '@') {
-               if (yych <= '/') goto yy406;
-               if (yych <= '9') goto yy431;
-               goto yy406;
+               if (yych <= '/') goto yy407;
+               if (yych <= '9') goto yy432;
+               goto yy407;
        } else {
-               if (yych <= 'F') goto yy431;
-               if (yych <= '`') goto yy406;
-               if (yych <= 'f') goto yy431;
-               goto yy406;
+               if (yych <= 'F') goto yy432;
+               if (yych <= '`') goto yy407;
+               if (yych <= 'f') goto yy432;
+               goto yy407;
        }
-yy427:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= '/') goto yy428;
-       if (yych <= '7') goto yy432;
 yy428:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= '/') goto yy429;
+       if (yych <= '7') goto yy433;
+yy429:
        YYCURSOR = YYMARKER;
        if (yyaccept == 0) {
-               goto yy403;
+               goto yy404;
        } else {
-               goto yy406;
-       }
-yy429:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= '@') {
-               if (yych <= '/') goto yy428;
-               if (yych <= '9') goto yy434;
-               goto yy428;
-       } else {
-               if (yych <= 'F') goto yy434;
-               if (yych <= '`') goto yy428;
-               if (yych <= 'f') goto yy434;
-               goto yy428;
+               goto yy407;
        }
 yy430:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '@') {
-               if (yych <= '/') goto yy428;
+               if (yych <= '/') goto yy429;
                if (yych <= '9') goto yy435;
-               goto yy428;
+               goto yy429;
        } else {
                if (yych <= 'F') goto yy435;
-               if (yych <= '`') goto yy428;
+               if (yych <= '`') goto yy429;
                if (yych <= 'f') goto yy435;
-               goto yy428;
+               goto yy429;
        }
 yy431:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '@') {
-               if (yych <= '/') goto yy428;
+               if (yych <= '/') goto yy429;
                if (yych <= '9') goto yy436;
-               goto yy428;
+               goto yy429;
        } else {
                if (yych <= 'F') goto yy436;
-               if (yych <= '`') goto yy428;
+               if (yych <= '`') goto yy429;
                if (yych <= 'f') goto yy436;
-               goto yy428;
+               goto yy429;
        }
 yy432:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= '@') {
+               if (yych <= '/') goto yy429;
+               if (yych <= '9') goto yy437;
+               goto yy429;
+       } else {
+               if (yych <= 'F') goto yy437;
+               if (yych <= '`') goto yy429;
+               if (yych <= 'f') goto yy437;
+               goto yy429;
+       }
+yy433:
        ++YYCURSOR;
 #line 455 "../src/ast/lex.re"
        { return unesc_oct(tok, cur); }
-#line 2397 "src/ast/lex.cc"
-yy434:
+#line 2410 "src/ast/lex.cc"
+yy435:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '@') {
-               if (yych <= '/') goto yy428;
-               if (yych <= '9') goto yy438;
-               goto yy428;
+               if (yych <= '/') goto yy429;
+               if (yych <= '9') goto yy439;
+               goto yy429;
        } else {
-               if (yych <= 'F') goto yy438;
-               if (yych <= '`') goto yy428;
-               if (yych <= 'f') goto yy438;
-               goto yy428;
+               if (yych <= 'F') goto yy439;
+               if (yych <= '`') goto yy429;
+               if (yych <= 'f') goto yy439;
+               goto yy429;
        }
-yy435:
+yy436:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '@') {
-               if (yych <= '/') goto yy428;
-               if (yych <= '9') goto yy431;
-               goto yy428;
+               if (yych <= '/') goto yy429;
+               if (yych <= '9') goto yy432;
+               goto yy429;
        } else {
-               if (yych <= 'F') goto yy431;
-               if (yych <= '`') goto yy428;
-               if (yych <= 'f') goto yy431;
-               goto yy428;
+               if (yych <= 'F') goto yy432;
+               if (yych <= '`') goto yy429;
+               if (yych <= 'f') goto yy432;
+               goto yy429;
        }
-yy436:
+yy437:
        ++YYCURSOR;
 #line 454 "../src/ast/lex.re"
        { return unesc_hex(tok, cur); }
-#line 2426 "src/ast/lex.cc"
-yy438:
+#line 2439 "src/ast/lex.cc"
+yy439:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '@') {
-               if (yych <= '/') goto yy428;
-               if (yych >= ':') goto yy428;
+               if (yych <= '/') goto yy429;
+               if (yych >= ':') goto yy429;
        } else {
-               if (yych <= 'F') goto yy439;
-               if (yych <= '`') goto yy428;
-               if (yych >= 'g') goto yy428;
+               if (yych <= 'F') goto yy440;
+               if (yych <= '`') goto yy429;
+               if (yych >= 'g') goto yy429;
        }
-yy439:
+yy440:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '@') {
-               if (yych <= '/') goto yy428;
-               if (yych <= '9') goto yy430;
-               goto yy428;
+               if (yych <= '/') goto yy429;
+               if (yych <= '9') goto yy431;
+               goto yy429;
        } else {
-               if (yych <= 'F') goto yy430;
-               if (yych <= '`') goto yy428;
-               if (yych <= 'f') goto yy430;
-               goto yy428;
+               if (yych <= 'F') goto yy431;
+               if (yych <= '`') goto yy429;
+               if (yych <= 'f') goto yy431;
+               goto yy429;
        }
 }
 #line 470 "../src/ast/lex.re"
@@ -2456,88 +2469,99 @@ uint32_t Scanner::lex_str_chr(char quote, bool &end)
     tok = cur;
     const uint32_t l = get_cline(), c = get_column();
     
-#line 2460 "src/ast/lex.cc"
+#line 2473 "src/ast/lex.cc"
 {
        YYCTYPE yych;
        unsigned int yyaccept = 0;
        if ((YYLIMIT - YYCURSOR) < 10) YYFILL(10);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= '\f') {
-               if (yych <= 0x00) goto yy442;
-               if (yych == '\n') goto yy446;
-               goto yy444;
+               if (yych <= 0x00) goto yy443;
+               if (yych == '\n') goto yy447;
+               goto yy445;
        } else {
-               if (yych <= '\r') goto yy448;
-               if (yych == '\\') goto yy449;
-               goto yy444;
+               if (yych <= '\r') goto yy449;
+               if (yych == '\\') goto yy450;
+               goto yy445;
        }
-yy442:
+yy443:
        ++YYCURSOR;
 #line 480 "../src/ast/lex.re"
        { fail_if_eof(); return 0; }
-#line 2479 "src/ast/lex.cc"
-yy444:
-       ++YYCURSOR;
+#line 2492 "src/ast/lex.cc"
 yy445:
+       ++YYCURSOR;
+yy446:
 #line 486 "../src/ast/lex.re"
        {
             end = tok[0] == quote;
             return static_cast<uint8_t>(tok[0]);
         }
-#line 2488 "src/ast/lex.cc"
-yy446:
+#line 2501 "src/ast/lex.cc"
+yy447:
        ++YYCURSOR;
 #line 481 "../src/ast/lex.re"
        { fatal_lc(l, c, "newline in character string"); }
-#line 2493 "src/ast/lex.cc"
-yy448:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '\n') goto yy446;
-       goto yy445;
+#line 2506 "src/ast/lex.cc"
 yy449:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == '\n') goto yy447;
+       goto yy446;
+yy450:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '`') {
-               if (yych <= '7') {
-                       if (yych <= '\f') {
-                               if (yych == '\n') goto yy446;
+               if (yych <= '3') {
+                       if (yych <= '\n') {
+                               if (yych <= 0x00) goto yy451;
+                               if (yych <= '\t') goto yy452;
+                               goto yy447;
                        } else {
-                               if (yych <= '\r') goto yy452;
-                               if (yych <= '/') goto yy450;
-                               if (yych <= '3') goto yy453;
+                               if (yych == '\r') goto yy454;
+                               if (yych <= '/') goto yy452;
                                goto yy455;
                        }
                } else {
                        if (yych <= 'W') {
-                               if (yych == 'U') goto yy456;
+                               if (yych <= '7') goto yy457;
+                               if (yych == 'U') goto yy458;
+                               goto yy452;
                        } else {
-                               if (yych <= 'X') goto yy458;
-                               if (yych == '\\') goto yy459;
+                               if (yych <= 'X') goto yy460;
+                               if (yych == '\\') goto yy461;
+                               goto yy452;
                        }
                }
        } else {
                if (yych <= 'q') {
                        if (yych <= 'e') {
-                               if (yych <= 'a') goto yy461;
-                               if (yych <= 'b') goto yy463;
+                               if (yych <= 'a') goto yy463;
+                               if (yych <= 'b') goto yy465;
+                               goto yy452;
                        } else {
-                               if (yych <= 'f') goto yy465;
-                               if (yych == 'n') goto yy467;
+                               if (yych <= 'f') goto yy467;
+                               if (yych == 'n') goto yy469;
+                               goto yy452;
                        }
                } else {
                        if (yych <= 'u') {
-                               if (yych <= 'r') goto yy469;
-                               if (yych <= 's') goto yy450;
-                               if (yych <= 't') goto yy471;
-                               goto yy458;
+                               if (yych <= 'r') goto yy471;
+                               if (yych <= 's') goto yy452;
+                               if (yych <= 't') goto yy473;
+                               goto yy460;
                        } else {
-                               if (yych <= 'v') goto yy473;
-                               if (yych == 'x') goto yy475;
+                               if (yych <= 'v') goto yy475;
+                               if (yych == 'x') goto yy477;
+                               goto yy452;
                        }
                }
        }
-yy450:
-       ++YYCURSOR;
 yy451:
+#line 484 "../src/ast/lex.re"
+       { fatal_lc(l, c, "syntax error in escape sequence"); }
+#line 2562 "src/ast/lex.cc"
+yy452:
+       ++YYCURSOR;
+yy453:
 #line 500 "../src/ast/lex.re"
        {
             if (tok[1] != quote) {
@@ -2545,206 +2569,206 @@ yy451:
             }
             return static_cast<uint8_t>(tok[1]);
         }
-#line 2549 "src/ast/lex.cc"
-yy452:
+#line 2573 "src/ast/lex.cc"
+yy454:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '\n') goto yy446;
-       goto yy451;
-yy453:
+       if (yych == '\n') goto yy447;
+       goto yy453;
+yy455:
        yyaccept = 0;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych <= '/') goto yy454;
-       if (yych <= '7') goto yy476;
-yy454:
+       if (yych <= '/') goto yy456;
+       if (yych <= '7') goto yy478;
+yy456:
 #line 483 "../src/ast/lex.re"
        { fatal_lc(l, c, "syntax error in octal escape sequence"); }
-#line 2562 "src/ast/lex.cc"
-yy455:
+#line 2586 "src/ast/lex.cc"
+yy457:
        ++YYCURSOR;
-       goto yy454;
-yy456:
+       goto yy456;
+yy458:
        yyaccept = 1;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yych <= '@') {
-               if (yych <= '/') goto yy457;
-               if (yych <= '9') goto yy478;
+               if (yych <= '/') goto yy459;
+               if (yych <= '9') goto yy480;
        } else {
-               if (yych <= 'F') goto yy478;
-               if (yych <= '`') goto yy457;
-               if (yych <= 'f') goto yy478;
+               if (yych <= 'F') goto yy480;
+               if (yych <= '`') goto yy459;
+               if (yych <= 'f') goto yy480;
        }
-yy457:
+yy459:
 #line 482 "../src/ast/lex.re"
        { fatal_lc(l, c, "syntax error in hexadecimal escape sequence"); }
-#line 2580 "src/ast/lex.cc"
-yy458:
+#line 2604 "src/ast/lex.cc"
+yy460:
        yyaccept = 1;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yych <= '@') {
-               if (yych <= '/') goto yy457;
-               if (yych <= '9') goto yy479;
-               goto yy457;
+               if (yych <= '/') goto yy459;
+               if (yych <= '9') goto yy481;
+               goto yy459;
        } else {
-               if (yych <= 'F') goto yy479;
-               if (yych <= '`') goto yy457;
-               if (yych <= 'f') goto yy479;
-               goto yy457;
+               if (yych <= 'F') goto yy481;
+               if (yych <= '`') goto yy459;
+               if (yych <= 'f') goto yy481;
+               goto yy459;
        }
-yy459:
+yy461:
        ++YYCURSOR;
 #line 499 "../src/ast/lex.re"
        { return static_cast<uint8_t>('\\'); }
-#line 2598 "src/ast/lex.cc"
-yy461:
+#line 2622 "src/ast/lex.cc"
+yy463:
        ++YYCURSOR;
 #line 492 "../src/ast/lex.re"
        { return static_cast<uint8_t>('\a'); }
-#line 2603 "src/ast/lex.cc"
-yy463:
+#line 2627 "src/ast/lex.cc"
+yy465:
        ++YYCURSOR;
 #line 493 "../src/ast/lex.re"
        { return static_cast<uint8_t>('\b'); }
-#line 2608 "src/ast/lex.cc"
-yy465:
+#line 2632 "src/ast/lex.cc"
+yy467:
        ++YYCURSOR;
 #line 494 "../src/ast/lex.re"
        { return static_cast<uint8_t>('\f'); }
-#line 2613 "src/ast/lex.cc"
-yy467:
+#line 2637 "src/ast/lex.cc"
+yy469:
        ++YYCURSOR;
 #line 495 "../src/ast/lex.re"
        { return static_cast<uint8_t>('\n'); }
-#line 2618 "src/ast/lex.cc"
-yy469:
+#line 2642 "src/ast/lex.cc"
+yy471:
        ++YYCURSOR;
 #line 496 "../src/ast/lex.re"
        { return static_cast<uint8_t>('\r'); }
-#line 2623 "src/ast/lex.cc"
-yy471:
+#line 2647 "src/ast/lex.cc"
+yy473:
        ++YYCURSOR;
 #line 497 "../src/ast/lex.re"
        { return static_cast<uint8_t>('\t'); }
-#line 2628 "src/ast/lex.cc"
-yy473:
+#line 2652 "src/ast/lex.cc"
+yy475:
        ++YYCURSOR;
 #line 498 "../src/ast/lex.re"
        { return static_cast<uint8_t>('\v'); }
-#line 2633 "src/ast/lex.cc"
-yy475:
+#line 2657 "src/ast/lex.cc"
+yy477:
        yyaccept = 1;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yych <= '@') {
-               if (yych <= '/') goto yy457;
-               if (yych <= '9') goto yy480;
-               goto yy457;
+               if (yych <= '/') goto yy459;
+               if (yych <= '9') goto yy482;
+               goto yy459;
        } else {
-               if (yych <= 'F') goto yy480;
-               if (yych <= '`') goto yy457;
-               if (yych <= 'f') goto yy480;
-               goto yy457;
+               if (yych <= 'F') goto yy482;
+               if (yych <= '`') goto yy459;
+               if (yych <= 'f') goto yy482;
+               goto yy459;
        }
-yy476:
+yy478:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= '/') goto yy477;
-       if (yych <= '7') goto yy481;
-yy477:
+       if (yych <= '/') goto yy479;
+       if (yych <= '7') goto yy483;
+yy479:
        YYCURSOR = YYMARKER;
        if (yyaccept == 0) {
-               goto yy454;
+               goto yy456;
        } else {
-               goto yy457;
+               goto yy459;
        }
-yy478:
+yy480:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '@') {
-               if (yych <= '/') goto yy477;
-               if (yych <= '9') goto yy483;
-               goto yy477;
+               if (yych <= '/') goto yy479;
+               if (yych <= '9') goto yy485;
+               goto yy479;
        } else {
-               if (yych <= 'F') goto yy483;
-               if (yych <= '`') goto yy477;
-               if (yych <= 'f') goto yy483;
-               goto yy477;
+               if (yych <= 'F') goto yy485;
+               if (yych <= '`') goto yy479;
+               if (yych <= 'f') goto yy485;
+               goto yy479;
        }
-yy479:
+yy481:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '@') {
-               if (yych <= '/') goto yy477;
-               if (yych <= '9') goto yy484;
-               goto yy477;
+               if (yych <= '/') goto yy479;
+               if (yych <= '9') goto yy486;
+               goto yy479;
        } else {
-               if (yych <= 'F') goto yy484;
-               if (yych <= '`') goto yy477;
-               if (yych <= 'f') goto yy484;
-               goto yy477;
+               if (yych <= 'F') goto yy486;
+               if (yych <= '`') goto yy479;
+               if (yych <= 'f') goto yy486;
+               goto yy479;
        }
-yy480:
+yy482:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '@') {
-               if (yych <= '/') goto yy477;
-               if (yych <= '9') goto yy485;
-               goto yy477;
+               if (yych <= '/') goto yy479;
+               if (yych <= '9') goto yy487;
+               goto yy479;
        } else {
-               if (yych <= 'F') goto yy485;
-               if (yych <= '`') goto yy477;
-               if (yych <= 'f') goto yy485;
-               goto yy477;
+               if (yych <= 'F') goto yy487;
+               if (yych <= '`') goto yy479;
+               if (yych <= 'f') goto yy487;
+               goto yy479;
        }
-yy481:
+yy483:
        ++YYCURSOR;
 #line 491 "../src/ast/lex.re"
        { return unesc_oct(tok, cur); }
-#line 2698 "src/ast/lex.cc"
-yy483:
+#line 2722 "src/ast/lex.cc"
+yy485:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '@') {
-               if (yych <= '/') goto yy477;
-               if (yych <= '9') goto yy487;
-               goto yy477;
+               if (yych <= '/') goto yy479;
+               if (yych <= '9') goto yy489;
+               goto yy479;
        } else {
-               if (yych <= 'F') goto yy487;
-               if (yych <= '`') goto yy477;
-               if (yych <= 'f') goto yy487;
-               goto yy477;
+               if (yych <= 'F') goto yy489;
+               if (yych <= '`') goto yy479;
+               if (yych <= 'f') goto yy489;
+               goto yy479;
        }
-yy484:
+yy486:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '@') {
-               if (yych <= '/') goto yy477;
-               if (yych <= '9') goto yy480;
-               goto yy477;
+               if (yych <= '/') goto yy479;
+               if (yych <= '9') goto yy482;
+               goto yy479;
        } else {
-               if (yych <= 'F') goto yy480;
-               if (yych <= '`') goto yy477;
-               if (yych <= 'f') goto yy480;
-               goto yy477;
+               if (yych <= 'F') goto yy482;
+               if (yych <= '`') goto yy479;
+               if (yych <= 'f') goto yy482;
+               goto yy479;
        }
-yy485:
+yy487:
        ++YYCURSOR;
 #line 490 "../src/ast/lex.re"
        { return unesc_hex(tok, cur); }
-#line 2727 "src/ast/lex.cc"
-yy487:
+#line 2751 "src/ast/lex.cc"
+yy489:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '@') {
-               if (yych <= '/') goto yy477;
-               if (yych >= ':') goto yy477;
+               if (yych <= '/') goto yy479;
+               if (yych >= ':') goto yy479;
        } else {
-               if (yych <= 'F') goto yy488;
-               if (yych <= '`') goto yy477;
-               if (yych >= 'g') goto yy477;
+               if (yych <= 'F') goto yy490;
+               if (yych <= '`') goto yy479;
+               if (yych >= 'g') goto yy479;
        }
-yy488:
+yy490:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '@') {
-               if (yych <= '/') goto yy477;
-               if (yych <= '9') goto yy479;
-               goto yy477;
+               if (yych <= '/') goto yy479;
+               if (yych <= '9') goto yy481;
+               goto yy479;
        } else {
-               if (yych <= 'F') goto yy479;
-               if (yych <= '`') goto yy477;
-               if (yych <= 'f') goto yy479;
-               goto yy477;
+               if (yych <= 'F') goto yy481;
+               if (yych <= '`') goto yy479;
+               if (yych <= 'f') goto yy481;
+               goto yy479;
        }
 }
 #line 506 "../src/ast/lex.re"
@@ -2767,7 +2791,7 @@ void Scanner::set_sourceline ()
 sourceline:
     tok = cur;
 
-#line 2771 "src/ast/lex.cc"
+#line 2795 "src/ast/lex.cc"
 {
        YYCTYPE yych;
        static const unsigned char yybm[] = {
@@ -2808,20 +2832,20 @@ sourceline:
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= '\r') {
                if (yych <= '\t') {
-                       if (yych >= 0x01) goto yy493;
+                       if (yych >= 0x01) goto yy495;
                } else {
-                       if (yych <= '\n') goto yy495;
-                       if (yych <= '\f') goto yy493;
-                       goto yy497;
+                       if (yych <= '\n') goto yy497;
+                       if (yych <= '\f') goto yy495;
+                       goto yy499;
                }
        } else {
                if (yych <= '"') {
-                       if (yych <= '!') goto yy493;
-                       goto yy498;
+                       if (yych <= '!') goto yy495;
+                       goto yy500;
                } else {
-                       if (yych <= '0') goto yy493;
-                       if (yych <= '9') goto yy499;
-                       goto yy493;
+                       if (yych <= '0') goto yy495;
+                       if (yych <= '9') goto yy501;
+                       goto yy495;
                }
        }
        ++YYCURSOR;
@@ -2831,36 +2855,36 @@ sourceline:
         tok = cur;
         return;
     }
-#line 2835 "src/ast/lex.cc"
-yy493:
+#line 2859 "src/ast/lex.cc"
+yy495:
        ++YYCURSOR;
-yy494:
+yy496:
 #line 549 "../src/ast/lex.re"
        { goto sourceline; }
-#line 2841 "src/ast/lex.cc"
-yy495:
+#line 2865 "src/ast/lex.cc"
+yy497:
        ++YYCURSOR;
 #line 538 "../src/ast/lex.re"
        {
         tok = cur;
         return;
     }
-#line 2849 "src/ast/lex.cc"
-yy497:
+#line 2873 "src/ast/lex.cc"
+yy499:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '\n') goto yy495;
-       goto yy494;
-yy498:
+       if (yych == '\n') goto yy497;
+       goto yy496;
+yy500:
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych <= 0x00) goto yy494;
-       if (yych == '\n') goto yy494;
-       goto yy503;
-yy499:
+       if (yych <= 0x00) goto yy496;
+       if (yych == '\n') goto yy496;
+       goto yy505;
+yy501:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yybm[0+yych] & 64) {
-               goto yy499;
+               goto yy501;
        }
 #line 525 "../src/ast/lex.re"
        {
@@ -2869,22 +2893,22 @@ yy499:
         }
         goto sourceline;
     }
-#line 2873 "src/ast/lex.cc"
-yy502:
+#line 2897 "src/ast/lex.cc"
+yy504:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-yy503:
+yy505:
        if (yybm[0+yych] & 128) {
-               goto yy502;
+               goto yy504;
        }
-       if (yych <= '\n') goto yy504;
-       if (yych <= '"') goto yy505;
-       goto yy507;
-yy504:
+       if (yych <= '\n') goto yy506;
+       if (yych <= '"') goto yy507;
+       goto yy509;
+yy506:
        YYCURSOR = YYMARKER;
-       goto yy494;
-yy505:
+       goto yy496;
+yy507:
        ++YYCURSOR;
 #line 532 "../src/ast/lex.re"
        {
@@ -2892,14 +2916,14 @@ yy505:
         strrreplace (in.escaped_file_name, "\\", "\\\\");
         goto sourceline;
     }
-#line 2896 "src/ast/lex.cc"
-yy507:
+#line 2920 "src/ast/lex.cc"
+yy509:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych <= 0x00) goto yy504;
-       if (yych == '\n') goto yy504;
-       goto yy502;
+       if (yych <= 0x00) goto yy506;
+       if (yych == '\n') goto yy506;
+       goto yy504;
 }
 #line 550 "../src/ast/lex.re"
 
index 3f7fb3cad48e297532b4c1ea09329142c5c21071..de9b5c88da67a8a256c287a133b3cacf1b60df01 100644 (file)
@@ -463,7 +463,7 @@ uint32_t Scanner::lex_cls_chr()
         esc "\\"   { return static_cast<uint8_t>('\\'); }
         esc "-"    { return static_cast<uint8_t>('-'); }
         esc "]"    { return static_cast<uint8_t>(']'); }
-        esc .      {
+        esc (.\eof){
             warn.useless_escape(cline, get_column(), tok[1]);
             return static_cast<uint8_t>(tok[1]);
         }
@@ -497,7 +497,7 @@ uint32_t Scanner::lex_str_chr(char quote, bool &end)
         esc "t"    { return static_cast<uint8_t>('\t'); }
         esc "v"    { return static_cast<uint8_t>('\v'); }
         esc "\\"   { return static_cast<uint8_t>('\\'); }
-        esc .      {
+        esc (.\eof){
             if (tok[1] != quote) {
                 warn.useless_escape(cline, get_column(), tok[1]);
             }
index 1abbbad911fc795d7832ea55a1c9af6f9bb15891..f3c52495bdc498f17813c041b804c246f53f0ce2 100644 (file)
@@ -1 +1 @@
-re2c: error: line 1, column 4: unexpected end of input
+re2c: error: line 1, column 9: unexpected end of input
index 98dbbcd118e7fde19f17be04318442fa0076ee5e..51b1cdf72462343933f79c0a878c977733082dcf 100644 (file)
@@ -1 +1 @@
-%{{"
\ No newline at end of file
+/*!re2c{"
\ No newline at end of file
index 4fb4d3cb3177da1acc40191639af7a820413a7e4..d9434be3fb2ef24b5b7e841a86c7c470d2a9f455 100644 (file)
@@ -1 +1 @@
-re2c: error: line 1, column 3: unexpected end of input
+re2c: error: line 1, column 8: unexpected end of input
index 4c522bddc76e312ca5963959c25910d7ce4f818d..39afb5afb59acaf7dcecbc1be690117cc3f7add0 100644 (file)
@@ -1 +1 @@
-%{[
\ No newline at end of file
+/*!re2c[
\ No newline at end of file
index 4fb4d3cb3177da1acc40191639af7a820413a7e4..d9434be3fb2ef24b5b7e841a86c7c470d2a9f455 100644 (file)
@@ -1 +1 @@
-re2c: error: line 1, column 3: unexpected end of input
+re2c: error: line 1, column 8: unexpected end of input
index e7c0b40db4ea733d12952f8df0848b7d8a5af800..ab9966f6b9fc62120243a8f8aab441e2b0dcef13 100644 (file)
@@ -1 +1 @@
-%{"
\ No newline at end of file
+/*!re2c"
\ No newline at end of file
diff --git a/re2c/test/american_fuzzy_lop/004.c b/re2c/test/american_fuzzy_lop/004.c
new file mode 100644 (file)
index 0000000..54a6aed
--- /dev/null
@@ -0,0 +1 @@
+re2c: error: line 1, column 8: syntax error in escape sequence
diff --git a/re2c/test/american_fuzzy_lop/004.re b/re2c/test/american_fuzzy_lop/004.re
new file mode 100644 (file)
index 0000000..28d167c
--- /dev/null
@@ -0,0 +1 @@
+/*!re2c"\
\ No newline at end of file
diff --git a/re2c/test/american_fuzzy_lop/005.c b/re2c/test/american_fuzzy_lop/005.c
new file mode 100644 (file)
index 0000000..54a6aed
--- /dev/null
@@ -0,0 +1 @@
+re2c: error: line 1, column 8: syntax error in escape sequence
diff --git a/re2c/test/american_fuzzy_lop/005.re b/re2c/test/american_fuzzy_lop/005.re
new file mode 100644 (file)
index 0000000..c32427b
--- /dev/null
@@ -0,0 +1 @@
+/*!re2c'\
\ No newline at end of file
diff --git a/re2c/test/american_fuzzy_lop/006.c b/re2c/test/american_fuzzy_lop/006.c
new file mode 100644 (file)
index 0000000..54a6aed
--- /dev/null
@@ -0,0 +1 @@
+re2c: error: line 1, column 8: syntax error in escape sequence
diff --git a/re2c/test/american_fuzzy_lop/006.re b/re2c/test/american_fuzzy_lop/006.re
new file mode 100644 (file)
index 0000000..13de171
--- /dev/null
@@ -0,0 +1 @@
+/*!re2c[\
\ No newline at end of file