diff options
author | Will Estes <westes@users.noreply.github.com> | 2021-08-13 11:37:10 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-08-13 11:37:10 -0400 |
commit | 7ea145a7e6c0b15270b0ea913e8afbbdc516f6ea (patch) | |
tree | 634d658c234d90bdcd16e34768f38a4c9dff6891 | |
parent | eac09011867e1c6afc9f0da028b82553a2d479f2 (diff) | |
parent | fceec5d95a206745bf100c16f34f68201a9a03fd (diff) | |
download | flex-git-7ea145a7e6c0b15270b0ea913e8afbbdc516f6ea.tar.gz |
Merge pull request #491 from Mightyjo/issue_469
Issue 469; Compute length of yy_state_buf correctly
-rw-r--r-- | src/FlexLexer.h | 1 | ||||
-rw-r--r--[-rwxr-xr-x] | src/Makefile.am | 1 | ||||
-rw-r--r-- | src/c99-flex.skl | 80 | ||||
-rw-r--r-- | src/cpp-flex.skl | 80 | ||||
-rw-r--r-- | src/go-flex.skl | 81 | ||||
-rw-r--r--[-rwxr-xr-x] | tests/Makefile.am | 16 | ||||
-rw-r--r--[-rwxr-xr-x] | tests/ruleset.am | 0 | ||||
-rw-r--r-- | tests/state_buf.direct.lll | 98 | ||||
-rw-r--r-- | tests/state_buf.direct.txt | 446 | ||||
-rw-r--r-- | tests/state_buf_multiple.direct.lll | 104 | ||||
-rw-r--r-- | tests/state_buf_multiple.direct.txt | 446 | ||||
-rwxr-xr-x | tests/testwrapper-direct.sh | 2 |
12 files changed, 1310 insertions, 45 deletions
diff --git a/src/FlexLexer.h b/src/FlexLexer.h index ccd9eeb..9b54949 100644 --- a/src/FlexLexer.h +++ b/src/FlexLexer.h @@ -202,6 +202,7 @@ protected: yy_state_type* yy_state_buf; yy_state_type* yy_state_ptr; + size_t yy_state_buf_max; char* yy_full_match; int* yy_full_state; diff --git a/src/Makefile.am b/src/Makefile.am index fada4a7..ce21a4d 100755..100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -130,6 +130,7 @@ endif dist-hook: scan.l flex$(EXEEXT) chmod u+w $(distdir) && \ + chmod u+w $(distdir)/scan.c && \ ./flex$(EXEEXT) -o scan.c $< && \ mv -f scan.c $(distdir) diff --git a/src/c99-flex.skl b/src/c99-flex.skl index 1e04afe..317c038 100644 --- a/src/c99-flex.skl +++ b/src/c99-flex.skl @@ -268,9 +268,11 @@ typedef struct yyguts_t *yyscan_t; /* Action number for EOF rule of a given start state. */ m4_define([[YY_STATE_EOF]], [[YY_END_OF_BUFFER + $1 + 1]]) -/* The state buf must be large enough to hold one state per character in the main buffer. +/* The state buf must be large enough to hold one state per character in the main buffer, + * plus the start state, plus the two end-of-buffer byte states. */ -m4_define([[YY_STATE_BUF_SIZE]], [[((YY_BUF_SIZE + 2) * sizeof(yy_state_type))]]) +m4_define([[YY_STATE_BUF_EXTRA_SPACE]], [[3]]) +m4_define([[YY_STATE_BUF_SIZE]], [[(YY_BUF_SIZE + YY_STATE_BUF_EXTRA_SPACE)]]) const bool FLEX_DEBUG = m4_ifdef([[M4_MODE_DEBUG]], [[true]], [[false]]); @@ -516,6 +518,7 @@ struct yyguts_t { m4_ifdef( [[M4_MODE_USES_REJECT]], [[ yy_state_type *yy_state_buf; yy_state_type *yy_state_ptr; + size_t yy_state_buf_max; char *yy_full_match; int yy_lp; @@ -847,6 +850,8 @@ void yypop_buffer_state (yyscan_t yyscanner) */ void yyrestart(FILE * input_file, yyscan_t yyscanner) { + size_t new_size = 0; + yy_state_type *new_state_buf = 0; if ( yy_current_buffer(yyscanner) == NULL ) { yyensure_buffer_stack (yyscanner); @@ -856,6 +861,30 @@ void yyrestart(FILE * input_file, yyscan_t yyscanner) yy_init_buffer( yyscanner->yy_buffer_stack[yyscanner->yy_buffer_stack_top], input_file, yyscanner); yy_load_buffer_state( yyscanner ); + +m4_ifdef( [[M4_MODE_USES_REJECT]], [[ + /* Ensure the reject state buffer is large enough. + */ + if ( yyscanner->yy_state_buf_max < (yy_current_buffer(yyscanner)->yy_buf_size + YY_STATE_BUF_EXTRA_SPACE) ) { + new_size = yy_current_buffer(yyscanner)->yy_buf_size + YY_STATE_BUF_EXTRA_SPACE; + new_state_buf = (yy_state_type*) yyrealloc( yyscanner->yy_state_buf, (new_size * sizeof(yy_state_type)), yyscanner ); + + if ( new_state_buf == NULL ) { + yypanic( "out of dynamic memory in yylex()", yyscanner ); + } + else { + yyscanner->yy_state_buf = new_state_buf; + yyscanner->yy_state_buf_max = new_size; + } + } +]] ) + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + yyscanner->yy_did_buffer_switch_on_eof = true; } static void yybumpline( yyscan_t yyscanner) { @@ -1567,7 +1596,9 @@ bool yyatbol(yyscan_t yyscanner) { */ void yy_switch_to_buffer(yybuffer new_buffer, yyscan_t yyscanner) { - + size_t new_size = 0; + yy_state_type *new_state_buf = 0; + /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); @@ -1587,6 +1618,23 @@ void yy_switch_to_buffer(yybuffer new_buffer, yyscan_t yyscanner) yyscanner->yy_buffer_stack[yyscanner->yy_buffer_stack_top] = new_buffer; yy_load_buffer_state( yyscanner ); +m4_ifdef( [[M4_MODE_USES_REJECT]], [[ + /* Ensure the reject state buffer is large enough. + */ + if ( yyscanner->yy_state_buf_max < (yy_current_buffer(yyscanner)->yy_buf_size + YY_STATE_BUF_EXTRA_SPACE) ) { + new_size = yy_current_buffer(yyscanner)->yy_buf_size + YY_STATE_BUF_EXTRA_SPACE; + new_state_buf = (yy_state_type *)yyrealloc( yyscanner->yy_state_buf, (new_size * sizeof(yy_state_type)), yyscanner ); + + if ( new_state_buf == NULL ) { + yypanic( "out of dynamic memory in yylex()", yyscanner ); + } + else { + yyscanner->yy_state_buf = new_state_buf; + yyscanner->yy_state_buf_max = new_size; + } + } +]] ) + /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe @@ -1972,17 +2020,6 @@ m4_ifdef( [[<M4_YY_BISON_LLOC>]], m4_ifdef([[YY_USER_INIT]], [[YY_USER_INIT]]) -m4_ifdef( [[M4_MODE_USES_REJECT]], -[[ - /* Create the reject buffer large enough to save one state per allowed character. */ - if ( yyscanner->yy_state_buf == NULL ) { - yyscanner->yy_state_buf = (yy_state_type *)yyalloc(YY_STATE_BUF_SIZE, yyscanner); - } - if ( yyscanner->yy_state_buf == NULL) { - yypanic( "out of dynamic memory in yylex()", yyscanner); - } -]]) - if ( yyscanner->yy_start == 0 ) { yyscanner->yy_start = 1; /* first start state */ } @@ -1997,6 +2034,20 @@ m4_ifdef( [[M4_MODE_USES_REJECT]], yyscanner->yy_buffer_stack[yyscanner->yy_buffer_stack_top] = yy_create_buffer( yyscanner->yyin_r, YY_BUF_SIZE, yyscanner); } + +m4_ifdef( [[M4_MODE_USES_REJECT]], +[[ + /* Create the reject buffer large enough to save one state per allowed character. + * If the reject buffer already exists, keep using it. + */ + if ( yyscanner->yy_state_buf == NULL ) { + yyscanner->yy_state_buf = (yy_state_type *)yyalloc(((yy_current_buffer(yyscanner)->yy_buf_size + YY_STATE_BUF_EXTRA_SPACE) * sizeof(yy_state_type)), yyscanner); + if ( yyscanner->yy_state_buf == NULL ) { + yypanic( "out of dynamic memory in yylex()", yyscanner ); + } + yyscanner->yy_state_buf_max = (yy_current_buffer(yyscanner)->yy_buf_size + YY_STATE_BUF_EXTRA_SPACE); + } +]]) yy_load_buffer_state( yyscanner ); } @@ -2355,6 +2406,7 @@ m4_ifdef( [[M4_MODE_USES_REJECT]], [[ yyscanner->yy_state_buf = 0; yyscanner->yy_state_ptr = 0; + yyscanner->yy_state_buf_max = 0; yyscanner->yy_full_match = 0; yyscanner->yy_lp = 0; ]]) diff --git a/src/cpp-flex.skl b/src/cpp-flex.skl index 1c62e3d..0941d4d 100644 --- a/src/cpp-flex.skl +++ b/src/cpp-flex.skl @@ -422,9 +422,11 @@ m4_ifdef( [[M4_YY_NOT_IN_HEADER]], m4_ifdef( [[M4_YY_NOT_IN_HEADER]], [[ -/* The state buf must be large enough to hold one state per character in the main buffer. +/* The state buf must be large enough to hold one state per character in the main buffer, + * plus the start state, plus the two end-of-buffer byte states. */ -#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) +#define YY_STATE_BUF_EXTRA_SPACE 3 +#define YY_STATE_BUF_SIZE (YY_BUF_SIZE + YY_STATE_BUF_EXTRA_SPACE) ]]) @@ -1074,6 +1076,7 @@ m4_ifdef( [[M4_YY_NOT_REENTRANT]], [[ m4_ifdef( [[M4_MODE_C_ONLY]], [[ /* Declare state buffer variables. */ static yy_state_type *yy_state_buf=0, *yy_state_ptr=0; +static size_t yy_state_buf_max=0; static char *yy_full_match; static int yy_lp; m4_ifdef( [[M4_MODE_VARIABLE_TRAILING_CONTEXT_RULES]], [[ @@ -1226,6 +1229,7 @@ struct yyguts_t { m4_ifdef( [[M4_MODE_USES_REJECT]], [[ yy_state_type *yy_state_buf; yy_state_type *yy_state_ptr; + size_t yy_state_buf_max; char *yy_full_match; int yy_lp; @@ -1876,17 +1880,6 @@ m4_ifdef( [[<M4_YY_BISON_LLOC>]], YY_USER_INIT; #endif -m4_ifdef( [[M4_MODE_USES_REJECT]], -[[ - /* Create the reject buffer large enough to save one state per allowed character. */ - if ( ! YY_G(yy_state_buf) ) { - YY_G(yy_state_buf) = (yy_state_type *)yyalloc(YY_STATE_BUF_SIZE M4_YY_CALL_LAST_ARG); - } - if ( ! YY_G(yy_state_buf) ) { - YY_FATAL_ERROR( "out of dynamic memory in yylex()" ); - } -]]) - if ( ! YY_G(yy_start) ) { YY_G(yy_start) = 1; /* first start state */ } @@ -1911,6 +1904,20 @@ m4_ifdef([[M4_MODE_CXX_ONLY]], [[ YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE M4_YY_CALL_LAST_ARG); } + +m4_ifdef( [[M4_MODE_USES_REJECT]], +[[ + /* Create the reject buffer large enough to save one state per allowed character. + * If the reject buffer already exists, keep using it. + */ + if ( ! YY_G(yy_state_buf) ) { + YY_G(yy_state_buf) = (yy_state_type *)yyalloc( ((YY_CURRENT_BUFFER_LVALUE->yy_buf_size + YY_STATE_BUF_EXTRA_SPACE) * sizeof(yy_state_type)) M4_YY_CALL_LAST_ARG); + if ( ! YY_G(yy_state_buf) ) { + YY_FATAL_ERROR( "out of dynamic memory in yylex()" ); + } + YY_G(yy_state_buf_max) = (YY_CURRENT_BUFFER_LVALUE->yy_buf_size + YY_STATE_BUF_EXTRA_SPACE); + } +]]) yy_load_buffer_state( M4_YY_CALL_ONLY_ARG ); } @@ -2323,6 +2330,7 @@ void yyFlexLexer::ctor_common() { m4_ifdef( [[M4_MODE_USES_REJECT]], [[ yy_state_buf = new yy_state_type[YY_STATE_BUF_SIZE]; + yy_state_buf_max = YY_STATE_BUF_SIZE; ]], [[ yy_state_buf = 0; @@ -2824,6 +2832,8 @@ void yyFlexLexer::yyrestart( std::istream& input_file ) ]]) { M4_YY_DECL_GUTS_VAR(); + size_t new_size = 0; + yy_state_type *new_state_buf = 0; if ( yy_current_buffer() == NULL ) { yyensure_buffer_stack (M4_YY_CALL_ONLY_ARG); @@ -2833,6 +2843,30 @@ void yyFlexLexer::yyrestart( std::istream& input_file ) yy_init_buffer( YY_CURRENT_BUFFER_LVALUE, input_file M4_YY_CALL_LAST_ARG); yy_load_buffer_state( M4_YY_CALL_ONLY_ARG ); + +m4_ifdef( [[M4_MODE_USES_REJECT]], [[ + /* Ensure the reject state buffer is large enough. + */ + if ( YY_G(yy_state_buf_max) < (yy_current_buffer()->yy_buf_size + YY_STATE_BUF_EXTRA_SPACE) ) { + new_size = yy_current_buffer()->yy_buf_size + YY_STATE_BUF_EXTRA_SPACE; + new_state_buf = (yy_state_type *)yyrealloc( YY_G(yy_state_buf), (new_size * sizeof(yy_state_type)) M4_YY_CALL_LAST_ARG ); + + if ( new_state_buf == NULL ) { + YY_FATAL_ERROR( "out of dynamic memory in yylex()" ); + } + else { + YY_G(yy_state_buf) = new_state_buf; + YY_G(yy_state_buf_max) = new_size; + } + } +]] ) + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + YY_G(yy_did_buffer_switch_on_eof) = 1; } m4_ifdef([[M4_MODE_CXX_ONLY]], [[ @@ -2862,6 +2896,8 @@ void yyFlexLexer::yy_switch_to_buffer( yybuffer new_buffer ) ]]) { M4_YY_DECL_GUTS_VAR(); + size_t new_size = 0; + yy_state_type *new_state_buf = 0; /* TODO. We should be able to replace this entire function body * with @@ -2881,6 +2917,23 @@ void yyFlexLexer::yy_switch_to_buffer( yybuffer new_buffer ) YY_CURRENT_BUFFER_LVALUE = new_buffer; yy_load_buffer_state( M4_YY_CALL_ONLY_ARG ); + +m4_ifdef( [[M4_MODE_USES_REJECT]], [[ + /* Ensure the reject state buffer is large enough. + */ + if ( YY_G(yy_state_buf_max) < (YY_CURRENT_BUFFER_LVALUE->yy_buf_size + YY_STATE_BUF_EXTRA_SPACE) ) { + new_size = YY_CURRENT_BUFFER_LVALUE->yy_buf_size + YY_STATE_BUF_EXTRA_SPACE; + new_state_buf = (yy_state_type *)yyrealloc( YY_G(yy_state_buf), (new_size * sizeof(yy_state_type)) M4_YY_CALL_LAST_ARG ); + + if ( new_state_buf == NULL ) { + YY_FATAL_ERROR( "out of dynamic memory in yylex()" ); + } + else { + YY_G(yy_state_buf) = new_state_buf; + YY_G(yy_state_buf_max) = new_size; + } + } +]] ) /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag @@ -3714,6 +3767,7 @@ m4_ifdef( [[M4_MODE_USES_REJECT]], [[ YY_G(yy_state_buf) = 0; YY_G(yy_state_ptr) = 0; + YY_G(yy_state_buf_max) = 0; YY_G(yy_full_match) = 0; YY_G(yy_lp) = 0; ]]) diff --git a/src/go-flex.skl b/src/go-flex.skl index f2807dd..53f0b90 100644 --- a/src/go-flex.skl +++ b/src/go-flex.skl @@ -194,9 +194,11 @@ m4_define([[YY_SC_TO_UI]], [[((YY_CHAR)($1))]]) /* Action number for EOF rule of a given start state. */ m4_define([[YY_STATE_EOF]], [[YY_END_OF_BUFFER + $1 + 1]]) -/* The state buf must be large enough to hold one state per character in the main buffer. +/* The state buf must be large enough to hold one state per character in the main buffer, + * plus the start state, plus the two end-of-buffer byte states. */ -m4_define([[YY_STATE_BUF_SIZE]], [[((flexInputBufferSize + 2) * sizeof(yyStateType))]]) +m4_define([[YY_STATE_BUF_EXTRA_SPACE]], [[3]]) +m4_define([[YY_STATE_BUF_SIZE]], [[(flexInputBufferSize + YY_STATE_BUF_EXTRA_SPACE)]]) const bool FLEX_DEBUG = m4_ifdef([[M4_MODE_DEBUG]], [[true]], [[false]]); @@ -447,6 +449,7 @@ m4_ifdef([[M4_MODE_YYTEXT_IS_ARRAY]], [[ m4_ifdef([[M4_MODE_USES_REJECT]], [[ yyStateType *yyStateBuf; yyStateType *yyStatePtr; + size_t yyStateBufMax; char *yyFullMatch; int yyLp; m4_ifdef([[M4_MODE_VARIABLE_TRAILING_CONTEXT_RULES]], [[m4_dnl @@ -756,7 +759,10 @@ void yypop_buffer_state (FlexLexer *yyscanner) */ void yyrestart(FILE * input_file, FlexLexer *yyscanner) { - + + size_t newSize = 0; + yyStateType *newStateBuf = 0; + if (yy_current_buffer(yyscanner) == NULL) { yyensure_buffer_stack (yyscanner); yyscanner->yyBufferStack[yyscanner->yyBufferStackTop] = @@ -765,6 +771,30 @@ void yyrestart(FILE * input_file, FlexLexer *yyscanner) yy_init_buffer(yyscanner->yyBufferStack[yyscanner->yyBufferStackTop], input_file, yyscanner); yy_load_buffer_state(yyscanner); + +m4_ifdef( [[M4_MODE_USES_REJECT]], [[ + /* Ensure the reject state buffer is large enough. + */ + if ( yyscanner->yyStateBufMax < (yy_current_buffer(yyscanner)->yyInputBufSize + YY_STATE_BUF_EXTRA_SPACE) ) { + newSize = yy_current_buffer(yyscanner)->yyInputBufSize + YY_STATE_BUF_EXTRA_SPACE; + newStateBuf = (yyStateType *)yyrealloc( yyscanner->yyStateBuf, (newSize * sizeof(yyStateType)), yyscanner ); + + if ( newStateBuf == NULL ) { + yypanic( "out of dynamic memory in yylex()", yyscanner ); + } + else { + yyscanner->yyStateBuf = newStateBuf; + yyscanner->yyStateBufMax = newSize; + } + } +]] ) + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + yyscanner->yyDidBufferSwitchOnEof = true; } static void yybumpline(FlexLexer *yyscanner) { @@ -1417,6 +1447,8 @@ bool yyatbol(FlexLexer *yyscanner) { */ void yy_switch_to_buffer(yybuffer newBuffer, FlexLexer *yyscanner) { + size_t newSize = 0; + yyStateType *newStateBuf = 0; /* TODO. We should be able to replace this entire function body * with @@ -1436,6 +1468,23 @@ void yy_switch_to_buffer(yybuffer newBuffer, FlexLexer *yyscanner) yyscanner->yyBufferStack[yyscanner->yyBufferStackTop] = newBuffer; yy_load_buffer_state(yyscanner); + +m4_ifdef( [[M4_MODE_USES_REJECT]], [[ + /* Ensure the reject state buffer is large enough. + */ + if ( yyscanner->yyStateBufMax < (yy_current_buffer(yyscanner)->yyInputBufSize + YY_STATE_BUF_EXTRA_SPACE) ) { + newSize = yy_current_buffer(yyscanner)->yyInputBufSize + YY_STATE_BUF_EXTRA_SPACE; + newStateBuf = (yyStateType *)yyrealloc( yyscanner->yyStateBuf, (newSize * sizeof(yyStateType)), yyscanner ); + + if ( newStateBuf == NULL ) { + yypanic( "out of dynamic memory in yylex()", yyscanner ); + } + else { + yyscanner->yyStateBuf = newStateBuf; + yyscanner->yyStateBufMax = newSize; + } + } +]] ) /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag @@ -1822,17 +1871,6 @@ m4_ifdef([[<M4_YY_BISON_LLOC>]], m4_ifdef([[YY_USER_INIT]], [[YY_USER_INIT]]) -m4_ifdef([[M4_MODE_USES_REJECT]], -[[ - /* Create the reject buffer large enough to save one state per allowed character. */ - if (yyscanner->yyStateBuf == NULL) { - yyscanner->yyStateBuf = (yyStateType *)yyalloc(YY_STATE_BUF_SIZE, yyscanner); - } - if (yyscanner->yyStateBuf == NULL) { - yypanic("out of dynamic memory in yylex()", yyscanner); - } -]]) - if (yyscanner->yyStart == 0) { yyscanner->yyStart = 1; /* first start state */ } @@ -1848,6 +1886,20 @@ m4_ifdef([[M4_MODE_USES_REJECT]], yy_create_buffer(yyscanner->yyin, flexInputBufferSize, yyscanner); } +m4_ifdef([[M4_MODE_USES_REJECT]], +[[ + /* Create the reject buffer large enough to save one state per allowed character. + * If the reject buffer already exists, keep using it. + */ + if (yyscanner->yyStateBuf == NULL) { + yyscanner->yyStateBuf = (yyStateType *)yyalloc((yy_current_buffer(yyscanner)->yyInputBufSize + YY_STATE_BUF_EXTRA_SPACE) * sizeof(yyStateType), yyscanner); + if ( yyscanner->yyStateBuf == NULL ) { + yypanic( "out of dynamic memory in yylex()", yyscanner ); + } + yyscanner->yyStateBufMax = (yy_current_buffer(yyscanner)->yyInputBufSize + YY_STATE_BUF_EXTRA_SPACE); + } +]]) + yy_load_buffer_state(yyscanner); } @@ -2204,6 +2256,7 @@ m4_ifdef([[M4_MODE_USES_REJECT]], [[ yyscanner->yyStateBuf = NULL; yyscanner->yyStatePtr = NULL; + yyscanner->yyStateBufMax = 0; yyscanner->yyFullMatch = NULL; yyscanner->yyLp = 0; ]]) diff --git a/tests/Makefile.am b/tests/Makefile.am index 43b0bb8..e9f3f49 100755..100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -95,7 +95,9 @@ DIRECT_TESTS = \ include_by_push.direct \ include_by_reentrant.direct \ rescan_nr.direct \ - rescan_r.direct + rescan_r.direct \ + state_buf.direct \ + state_buf_multiple.direct I3_TESTS = \ cxx_yywrap.i3 @@ -151,6 +153,8 @@ top_SOURCES = top.l top_main.c nodist_top_SOURCES = top.h yyextra_nr_SOURCES = yyextra_nr.l yyextra_c99_SOURCES = yyextra_c99.l +state_buf_direct_SOURCES = state_buf.direct.lll +state_buf_multiple_direct_SOURCES = state_buf_multiple.direct.lll # Normally, automake would distribute files built by flex. Since the # point of the test suite is to test the files that flex builds, and @@ -217,14 +221,16 @@ CLEANFILES = \ top.h \ yyextra_nr.c \ yyextra_c99.c \ + state_buf.direct.cc \ + state_buf_multiple.direct.cc \ $(RULESET_REMOVABLES) dist-hook: chmod u+w $(distdir) && \ for file in $(CLEANFILES) ; do \ - rm -f $(distdir)/$$file \ - chmod u+w $(distdir)/$$file \ - ; done + chmod u+w $(distdir)/$$file 2>/dev/null; \ + rm -f $(distdir)/$$file; \ + done EXTRA_DIST = \ README \ @@ -284,6 +290,8 @@ EXTRA_DIST = \ yymorearray.txt \ yymorearraybol.txt \ yyunput.txt \ + state_buf.direct.txt \ + state_buf_multiple.direct.txt \ $(RULESETS) dist_noinst_SCRIPTS = \ diff --git a/tests/ruleset.am b/tests/ruleset.am index 35ea944..35ea944 100755..100644 --- a/tests/ruleset.am +++ b/tests/ruleset.am diff --git a/tests/state_buf.direct.lll b/tests/state_buf.direct.lll new file mode 100644 index 0000000..a0085d6 --- /dev/null +++ b/tests/state_buf.direct.lll @@ -0,0 +1,98 @@ +/* + * This file is part of flex. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE. + */ + +%{ +/* A template scanner file to build "scanner.cc". + The scanner tests that we correctly initialize the state buffer + for long input buffers owned by code that calls yylex. + + This tests guards against reversions to CVE-2006-0459, + in particular when variable trailing context rules are used. + */ +#include <iostream> +#include <fstream> +#include <vector> + +#define ECHO +%} + +%option prefix="test" +%option noyywrap + +ID [_a-zA-Z]+[_0-9a-zA-Z]* + +BBC1 ([^(]*|"("[^(]*")") + +/** + * Balanced Bracketed Content. + * May not contain bracket, but if it does then it is balanced. + */ +BBC ({BBC1}*|"("{BBC1}*")") + +FPD "("{BBC}*")" + +%% + +{ID}/{FPD}\{ { + return 1234; +} + +%% + +std::vector<char> readFile(const char* filename) +{ + std::vector<char> contents; + std::ifstream in(filename, std::ios::in | std::ios::binary); + if (in) + { + in.seekg(0, std::ios::end); + size_t size = static_cast<size_t>(in.tellg()); + contents.resize(size + 2); + in.seekg(0, std::ios::beg); + in.read(contents.data(), size); + in.close(); + + contents[size + 0] = '\0'; + contents[size + 1] = '\0'; + } + else { + std::cerr << "*** Error: std::ifstream(" << filename << ") failed." << std::endl; + exit(-1); + } + return contents; +} + +int main(int argc, char** argv) +{ + if ( argc != 2 ) { + std::cerr << "*** Error: Must specify one filename." << std::endl; + exit(-1); + } + + std::vector<char> stm = readFile( argv[1] ); + test_scan_buffer(stm.data(), stm.size()); + + testlex(); + + return 0; // All went well. +} diff --git a/tests/state_buf.direct.txt b/tests/state_buf.direct.txt new file mode 100644 index 0000000..858653c --- /dev/null +++ b/tests/state_buf.direct.txt @@ -0,0 +1,446 @@ +// +////////////////////////////////////////////////////////////////////////////// +// +// trsntupsm 2018 eemremad, dor. eoo tupsma tmamttme. +// +// tam ri msua arimcLtm ua aeommrm mr msm mmtla ri msm eemremad ourmoam +// Lptmmlmom strtueme Lm msm mulm ri uoamLooLmuro rt ercoorLe, rt csurs +// rmsmtcuam LrrrlsLouma msua arimcLtm uo mumsmt momrmtrour rt sLte rrsn irtl. +// +////////////////////////////////////////////////////////////////////////////// +// +#uioemi __eeeiecit_a +#emiuom __eeeiecit_a + +#uoroeem "torommrm.s" +#uoroeem "tortmtteom.s" +#uoroeem "eoue.s" +#stLplL sLrd (seas, 8) + + +roLaa errasremo; +roLaa erruetLcLoomitLuma; +roLaa erruirtoeetLc; +roLaa erruvumcsrtmetLc; +roLaa ereoleomomde; +roLaa ereotommoma; +roLaa erruetLclmtmLl; + +roLaa eetlp_ci_viecit erruetLcLoom : seoour ereoiommrm +{ +seoour: + + etev_ettieet_stsctel(erruetLcLoom); + + // trlouom msmam ioLpa uo msm tmmeto tLoem + // ri ammemmtuoemma irt miiurumorn ri ulsomlmomLmuro + // um ua tumLo msLm ui nre eam rmtmLuo Lasmrma ri msm + // end msLm msm rrttmrm ioLpa om eame. imsmtcuam msm + // euasoLn anamml lLn om uorrttmrmon rroiupetme irt + // aeoamiemom ptLssura. ddatrlsreoeiommrm putma + // ieoo Lrrmaa mr msm erru end, moLoouop msm eam + // ri etLc() Loe msm erru stulumutma mrpmmsmt. toLoouop + // msua lLdma msm moLortLmuro ri Lo rommrm lLtpuoLoon + // aorcmt. lr nre asreoe eam msm orcmam tLoem LsstrstuLmm. + // + // + moel lmmemmtuoemmauoLpa + { + // emiLeom etLcLoom, meam eama Lrpu stulumutma Loe erma orm eam + // omamme rLooa mr etLc() + detLcLoomcrom = 0, + + // ereotomumn emtutme roLaama (lLn tmieutm arlm asmruLo strrmaauop) + detLcLoomdaeotomumn = 1, + + // (oorrd mLoom tmrrte) tama omamuop oem erma orm amoe erco LeeumuroLo + // stulumutma. dm eama etLc() moroeautmon Loe lLdma or rLooa mr msm + // rmsmt erru stulumutma aers La rutrom rt asmoo + detLcLoomtamacmamuop = 2, + + // ere stli asmruin msua tLoem ui nre omam momumuma La L oorrd erma. + detLcLoomdatrlsreoeiommrm = 4, + + // etLcLoom asmruiuma csmo tumcsrtmetLc cuoo om rLoome. tlsorn + // smt-vumcsrtm rLrsuop ri tumcsrtmetLc pmrlmmtn. ea cmoo, msua + // etLcLoom erma orm eam crtoeetLc. + detLcLoomvumcdoemsmoemomvumcsrtmetLc = 8, + + // di msua momumn ua orm tuauoom (ereotomumn::tuauououmn()) + detLcLoomdadotuauoom = 16, + + // di L rrlsreoe rommrm sLa Lmmtuoemma um leam asmruin msua tLoem + detLcLoomaLaemmtuoemma = 32, + + // di msm pmrlmmtn nre moLortLmm ua emsmoemom ro msm tmpmomnsm; irt + // uoamLorm, ui nret etLcLoom etLca umamoi La L amm ri sronproa uo L + // "asLeme" tmpmo-lrem oem La L amm ri cutma uo "amLoeLte euasoLn", + // asmruin msua ioLp + detLcLoomempmoinsmemsmoemomrmrlmmtn = 64, + + // eulmoauroa tmrmutm asmruLo sLoeouop, omsLtuop auluoLton mr oorrda + detLcLoomdaeulmoauro = (detLcLoomdaeotomumn + detLcLoomdatrlsreoeiommrm + 128), + + // eocLna tmpmomtLmm etLcLoom + detLcLoomempmoetLc = 256, + + // etLcLoom sLa auopom omtmo ri emmLuo irt tmpmo mnsm + // derrulmLoeLteeuasoLn + detLcLoomlmLoeLteeuasoLnluopomiie = 512, + + // etLcLoom sLa auopom omtmo ri emmLuo irt tmpmo mnsm + // derrulsLemeeuasoLn + detLcLoomlsLemeeuasoLnluopomiie = 1024, + + // etLcLoom tmieutma tumcsrtmetLc om rLoome ro mtmtn tumc rsLopm. + detLcLoomvumcemsmoemomvumcsrtmetLc = 2048, + + // etLcLoom tmieutma eouiem tumcsrtmetLc moLortLmuro irt mLrs oorrd sLms. + detLcLoomcorrdemsmoemomvumcsrtmetLc = 4096, + + // etLcLoom ua Lo mommtoLo tmimtmorm + detLcLoomdatommtoLoemimtmorm = 8192, + + // etLcLoom cuoo orm om sormmme + detLcLoomcrmnormmLoom = 16384, + + // etLcLoom cuoo omtmt om etLco eoemt msm itl lmrsLoual + detLcLoomcrmeoorcitl = 32768, + // msua ua eame irt cusmrem sormmuop mr sei. + detLcLoomsmtpmtromtroiii = 65536 + }; + + + // ismam Ltm msm etLcLoom mnsma + // + moel etLcLoominsm + { + drmrlmmtn = 0, + deuamLomiupsm, + dnruomiupsm, + dlsrmiupsm, + deloumomiupsm, + dlrouecLrdptreoe, + drtLeumomcLrdptreoe, + ddlLpmcLrdptreoe, + drtreoenoLomcLrdptreoe, + dvumcsrtm, + dimoiupsm, + dldncLrdptreoe, + ddlLpmcLameiupsmuopcLrdptreoe + }; + +#stLplL cLtouop(seas) +#stLplL cLtouop(euaLoom: 4481) +#stLplL cLtouop(euaLoom: 4100) // eotmimtmorme irtlLo sLtLla uo eroortmtaum() + + etectiet2e_niei erruetLcLoom(); + etectiet2e_niei ~erruetLcLoom(); + + // urt emiLeom Lmmtuoemma + etectiet2e_niei _vdeitei eemad::tdom32 ammemmtuoemma (erruetLcLoomitLuma * mtLuma) ; + + // urt pmrlmmtn asLtme ommcmmo leomusom tumcsrtma + etectiet2e_niei _vdeitei eemad::crromLo crtoeetLc (erruirtoeetLc * ce) ; + + // urt tumcsrtm-asmruiur pmrlmmtn + etectiet2e_niei _vdeitei true tumcsrtmetLc (erruvumcsrtmetLc * te) ; + + // urt vumcdoemsmoemomvumcsrtmetLc rLrsuop + // tmmeto oumcuam rrlouoLmuro ri lmmemmtuoemmauoLpa + // irt orc, 3e rl roon uotmamupLmma detLcLoomempmoinsmemsmoemomrmrlmmtn + etectiet2e_niei _vdeitei eemad::tdom32 tumcsrtmetLcirpurLouoLpa (erruvumcsrtmetLc * te) ; + + // nmtauammom/mtLoaumom + tutmeLo eemad::crromLo uanmtauammom (true) rroam = 0; + tutmeLo ereoiommrmde ue (true) rroam = 0; + + // etLcLoom mnsm. + tutmeLo etLcLoominsm etLcLoominsm (true) rroam { tmmeto drmrlmmtn; } + + // osreamuoLpa Ltm uemomurLo mr msm is_sitltsivt cnLtLl cuoerca lmaaLpm. lmm slec irt msram ioLpa, msmn Ltm strtueme La ua. + // tmamm ua mtem ui troortmt ua tmammmuop rt omLtuop nret rommrm. + // tmmeto mtem ui nre cLom troortmt mr mtLrd nret rommrm, iLoam mr uportm um. + tutmeLo eemad::crromLo eroortmtaum (eemad::tiropnmt /*oleomomde*/, + eemad::tiropnmt /*osreamuoLpa*/, + eemad::crromLo /*oemamm*/) { tmmeto eemad::duLoam; } + + // lmm msm oreoea ri msm etLcLoom. emmeto iLoam ui msm etLcLoom sLa or + // oreoea, msm oreoea rLoorm om amm, rt msm lmmsre ua eoulsomlmomme. + tutmeLo orro oreoea (ereotommoma& /*oreoea*/) rroam { tmmeto iLoam; } + + // etLc amtmLl + etectiet2e_niei tutmeLo true ammetLclmtmLl (erruetLclmtmLl * slmtmLl); + etectiet2e_niei tutmeLo erruetLclmtmLl* etLclmtmLl (true) rroam; + +#stLplL cLtouop(srs) + +strmmrmme: + itumoe roLaa erruetLcLoomitmtteom; + + tutmeLo eemad::tdom32 aeolmmemmtuoemma (erruetLcLoomitLuma * mtLuma) = 0; + + tutmeLo eemad::crromLo aeoirtoeetLc (erruirtoeetLc * ce) = 0; + + tutmeLo true aeovumcsrtmetLc (erruvumcsrtmetLc * te) = 0; + + tutmeLo eemad::tdom32 aeovumcsrtmetLcirpurLouoLpa (erruvumcsrtmetLc * /*te*/) { tmmeto 0; } + +stutLmm: + itumoe roLaa erruetLcLoomerrmaartn; + + roLaa erruetLcLoomerrmaartn* l_serrmaartn; +}; + +/// <strsmtmn oLlm="tmtauroasmruiur" tLoem="=18.0.0.0" /> +/// +/// <emartusmuro> +/// erruetLcLoomitmtteom rtmtteoma L aeoamm ri etLc tmoLmme +/// rsmtLmuroa msLm erruetLcLoom roLaa asmruiuma. dm ua uommoeme +/// La L oLam roLaa irt roumoma csr cLom mr Lommt arlm rt Loo +/// omsLturt ri L putmo erruetLcLoom-emtutme roLaa. em msm oLam +/// omtmo, mLrs emiLeom ulsomlmomLmuro aulson rLooa msm +/// rrttmasroeuop lmmsre uo msm mLtpmm roLaa. +/// </emartusmuro> +roLaa erruetLcLoomitmtteom : seoour ereoitmtteom +{ +seoour: + etev_ettieet_stsctel(erruetLcLoomitmtteom); + + etectiet2e_niei erruetLcLoomitmtteom(); + /// <strsmtmn oLlm="tmtauroasmruiur" tLoem="=18.0.0.0" /> + /// + /// <emartusmuro> + /// itmtteoma erruetLcLoom::ammemmtuoemma lmmsre. + /// </emartusmuro> + /// <tmlLtda> + /// ism emiLeom ulsomlmomLmuro ri + /// erruetLcLoomitmtteom::ammemmtuoemma rLooa + /// erruetLcLoom::aeolmmemmtuoemma. + /// </tmlLtda> + /// <sLtLl oLlm="sleommrm">nruommt mr Lo ereoiommrm msLm msua + /// rtmtteom ua Lssoume LpLuoam.</sLtLl> + /// <sLtLl oLlm="mtLuma">nruommt mr msm ptLssura mtLuma.</sLtLl> + etectiet2e_niei tutmeLo eemad::tdom32 ammemmtuoemma (erruetLcLoom* sleommrm, erruetLcLoomitLuma * mtLuma); + /// <strsmtmn oLlm="tmtauroasmruiur" tLoem="=18.0.0.0" /> + /// + /// <emartusmuro> + /// itmtteoma erruetLcLoom::crtoeetLc. + /// </emartusmuro> + /// <sLtLl oLlm="sleommrm">nruommt mr Lo ereoiommrm msLm msua + /// rtmtteom ua Lssoume LpLuoam.</sLtLl> + /// <sLtLl oLlm="ce">nruommt mr msm ptLssura mtLuma.</sLtLl> + /// <tmlLtda> + /// ism emiLeom ulsomlmomLmuro ri erruetLcLoomitmtteom::crtoeetLc + /// rLooa msm strmmrmme tutmeLo erruetLcLoom::aeoirtoeetLc + /// lmmsre. + /// </tmlLtda> + etectiet2e_niei tutmeLo eemad::crromLo crtoeetLc (erruetLcLoom* sleommrm, erruirtoeetLc * ce); + /// <strsmtmn oLlm="tmtauroasmruiur" tLoem="=18.0.0.0" /> + /// + /// <emartusmuro> + /// itmtteoma erruetLcLoom::tumcsrtmetLc lmmsre. + /// </emartusmuro> + /// <tmlLtda> + /// emiLeom ulsomlmomLmuro ri erruetLcLoomitmtteom::tumcsrtmetLc + /// rLooa strmmrmme tutmeLo erruetLcLoom::aeovumcsrtmetLc lmmsre. + /// + /// </tmlLtda> + etectiet2e_niei tutmeLo true tumcsrtmetLc (erruetLcLoom* sleommrm, erruvumcsrtmetLc * te); + /// <strsmtmn oLlm="tmtauroasmruiur" tLoem="=18.0.0.0" /> + /// + /// <emartusmuro> + /// itmtteoma erruetLcLoom::tumcsrtmetLcirpurLouoLpa lmmsre. + /// </emartusmuro> + /// <tmlLtda> + /// ism emiLeom ulsomlmomLmuro ri erruetLcLoomitmtteom:: + /// tumcsrtmetLcirpurLouoLpa rLooa msm strmmrmme tutmeLo + /// erruetLcLoom:: aeovumcsrtmetLcirpurLouoLpa lmmsre. + /// </tmlLtda> + etectiet2e_niei tutmeLo eemad::tdom32 tumcsrtmetLcirpurLouoLpa (erruetLcLoom* sleommrm, erruvumcsrtmetLc * te); +}; + +/// <emartusmuro> +/// erruetLcLoomemLrmrt strtuema ormuiurLmuroa ri dmn erruetLcLoom- +/// tmoLmme mtmoma uoroeeuop ompuo/moe tmpmo, lreuiurLmuro, Loe +/// mtLaetm. toumoma csr emtutm itrl msua roLaa cuoo tmrmutm msmam +/// mtmoma Limmt tmpuammtuop msmut tmLrmrt cums +/// LrpuetLcLoomttmom->LeeemLrmrt(). +/// </emartusmuro> +roLaa etectiet2e_niei erruetLcLoomemLrmrt : seoour ereoiommrm +{ +seoour: + etev_ettieet_stsctel(erruetLcLoomemLrmrt); + + /// <emartusmuro> + /// ism ptLssura anamml csurs ua tmpmomtLmuop msm etLcLoom. + /// </emartusmuro> + moel empmouoLpa + { + d2eempmo, + d3eempmo + }; + + /// <emartusmuro> + /// isua mtmom aupoLoa msm ompuoouop ri L etLcLoom'a tmpmo. + /// </emartusmuro> + /// <sLtLl oLlm="setLcLoom">dosem etLcLoom Lorem mr om tmpmomtLmme.</sLtLl> + /// <sLtLl oLlm="ioLpa">dosem ptLssura anamml msLm cuoo smtirtl msm tmpmo. </sLtLl> + tutmeLo true ompuoempmo (erruetLcLoom* /*setLcLoom*/, empmouoLpa /*ioLpa*/) {} + + /// <emartusmuro> + /// isua mtmom aupoLoa msm moe ri L etLcLoom'a tmpmo. + /// </emartusmuro> + /// <sLtLl oLlm="setLcLoom">dosem etLcLoom msLm cLa tmpmomtLmme.</sLtLl> + /// <sLtLl oLlm="ioLpa">dosem ptLssura anamml msLm smtirtlme msm tmpmo.</sLtLl> + tutmeLo true moeempmo (erruetLcLoom* /*setLcLoom*/, empmouoLpa /*ioLpa*/) {} + + /// <emartusmuro> + /// isua mtmom aupoLoa msm lreuiurLmuro ri L etLcLoom'a ptLssura. + /// </emartusmuro> + /// <sLtLl oLlm="setLcLoom">dosem etLcLoom csram ptLssura cmtm lreuiume.</sLtLl> + tutmeLo true lreuiume (erruetLcLoom* /*setLcLoom*/) {} + + /// <emartusmuro> + /// isua mtmom aupoLoa msm mtLaetm ri L etLcLoom'a ptLssura. + /// </emartusmuro> + /// <sLtLl oLlm="setLcLoom">dosem etLcLoom csram ptLssura cmtm mtLame.</sLtLl> + tutmeLo true mtLame (erruetLcLoom* /*setLcLoom*/) {} + + /// <emartusmuro> + /// isua mtmom aupoLoa ptLssura Ltm omuop sLoeme rtmt itrl rom etLcLoom mr Lormsmt etLcLoom. + /// </emartusmuro> + /// <sLtLl oLlm="setLcLoomutrl">dosem etLcLoom itrl csurs ptLssura cuoo om sLoeme rtmt. </sLtLl> + /// <sLtLl oLlm="setLcLoomir">dosem etLcLoom mr csurs ptLssura cuoo om sLoeme rtmt. </sLtLl> + tutmeLo true sLoeitmtir (erruetLcLoom* /*setLcLoomutrl*/, erruetLcLoom* /*setLcLoomir*/) {} + + /// <emartusmuro> + /// isua mtmom aupoLoa msm mtLaetm ri L etLcLoom'a ptLssura. + /// </emartusmuro> + /// <sLtLl oLlm="setLcLoom">dosem etLcLoom csram ptLssura cmtm mtLame.</sLtLl> + /// <sLtLl oLlm="sLtmomde">dosem ue ri sLtmom etLcLoom.</sLtLl> + tutmeLo true mtLame(erruetLcLoom* /*setLcLoom*/, eemad::domeode /*sLtmomde*/) {} + + /// <emartusmuro> + /// isua mtmom aupoLoa msm lreuiurLmuro ri L etLcLoom'a ptLssura. + /// </emartusmuro> + /// <sLtLl oLlm="setLcLoom">dosem etLcLoom csram ptLssura cmtm lreuiume.</sLtLl> + /// <sLtLl oLlm="sLtmomde">dosem ue ri sLtmom etLcLoom.</sLtLl> + tutmeLo true lreuiume(erruetLcLoom* /*setLcLoom*/, eemad::domeode /*sLtmomde*/) {} + + /// <emartusmuro> + /// isua mtmom aupoLoa msm Leeumuro ri L etLcLoom'a ptLssura. + /// </emartusmuro> + /// <sLtLl oLlm="setLcLoom">dosem etLcLoom csram ptLssura cmtm Leeme. </sLtLl> + /// <sLtLl oLlm="sLtmomde">dosem ue ri sLtmom etLcLoom.</sLtLl> + /// <sLtLl oLlm="eLmLoLamnmt">dosem eLmLoLam sruommt rLam La iicr_nie.</sLtLl> + tutmeLo true Leeme(erruetLcLoom* /*setLcLoom*/, eemad::domeode /*sLtmomde*/, eemad::iropnmt /*eLmLoLamnmt*/) {} +}; + +/// <emartusmuro> +/// erruetLcLoomttmom lLoLpma L amm ri erruetLcLoomemLrmrta Loe amoea +/// ormuiurLmuroa mr msml csmo rmtmLuo mtmoma rrret. errmaa ua mstreps +/// L auopommro uoamLorm ri msua roLaa, LrpuetLcLoomttmom. toumoma ri +/// erruetLcLoomttmom iLoo uomr mstmm rLmmprtuma: +/// +/// 1. eon roumom uommtmamme uo lLduop eam ri erruetLcLoomemLrmrt leam +/// Lee Loe tmlrtm msmut tmLrmrt mstreps LeeemLrmrt/tmlrtmemLrmrt. +/// +/// 2. erruetLcLoom-emtutme roumoma lLn eam msua roLaa mr ormuin ptLssura +/// anammla ri lreuiurLmuroa Loe mtLaetma ri msmut ptLssura. +/// +/// 3. rtLssura anammla lLn eam msua roLaa mr ormuin uommtmamme ouammomta +/// (m.p. erruetLclmtmLl) ri tmpmo ompuo/moe mtmoma. +/// </emartusmuro> +#emiuom LrpuetLcLoomttmom (&erruetLcLoomttmom::uoamLorm()) + +roLaa erruetLcLoomttmom : seoour ereoiommrm +{ +seoour: + etev_ettieet_stsctel(erruetLcLoomttmom); + + + /// <emartusmuro> + /// isua amLmur lmmsre tmmetoa msm auopommro uoamLorm ri msua roLaa. tam msm LrpuetLcLoomttmom lLrtr irt rrotmoumorm. + /// </emartusmuro> + /// <tmmetoa>ism rom erruetLcLoomttmom.</tmmetoa> + etectiet2e_niei amLmur erruetLcLoomttmom& uoamLorm(); + + /// <emartusmuro> + /// eee msm tmLrmrt mr msm ouam ri tmLrmrta msLm Ltm ormuiume csmo etLcLoom mtmoma rrret. + /// </emartusmuro> + /// <sLtLl oLlm="semLrmrt">dosem tmLrmrt mr moLoom ormuiurLmuro ri etLcLoom mtmoma.</sLtLl> + tutmeLo true LeeemLrmrt (erruetLcLoomemLrmrt* semLrmrt); + + /// <emartusmuro> + /// emlrtm msm tmLrmrt itrl msm ouam ri tmLrmrta msLm Ltm ormuiume csmo etLcLoom mtmoma rrret. + /// </emartusmuro> + /// <sLtLl oLlm="semLrmrt">dosem tmLrmrt mr euaLoom ormuiurLmuro ri etLcLoom mtmoma. </sLtLl> + tutmeLo true tmlrtmemLrmrt (erruetLcLoomemLrmrt* semLrmrt); + + /// <emartusmuro> + /// lupoLo msm ompuoouop ri L etLcLoom'a tmpmo mr msm ouam ri tmLrmrta. + /// </emartusmuro> + /// <sLtLl oLlm="setLcLoom">dosem etLcLoom Lorem mr om tmpmomtLmme. </sLtLl> + /// <sLtLl oLlm="ioLpa">dosem ptLssura anamml msLm cuoo smtirtl msm tmpmo. </sLtLl> + tutmeLo true amoecmpuoempmo (erruetLcLoom* setLcLoom, erruetLcLoomemLrmrt::empmouoLpa ioLpa); + + /// <emartusmuro> + /// lupoLo msm moe ri L etLcLoom'a tmpmo mr msm ouam ri tmLrmrta. + /// </emartusmuro> + /// <sLtLl oLlm="setLcLoom">dosem etLcLoom msLm cLa tmpmomtLmme.</sLtLl> + /// <sLtLl oLlm="ioLpa">dosem ptLssura anamml msLm smtirtlme msm tmpmo.</sLtLl> + tutmeLo true amoetoeempmo (erruetLcLoom* setLcLoom, erruetLcLoomemLrmrt::empmouoLpa ioLpa); + + /// <emartusmuro> + /// lupoLo msm lreuiurLmuro ri L etLcLoom'a ptLssura mr msm ouam ri tmLrmrta. + /// </emartusmuro> + /// <sLtLl oLlm="setLcLoom">dosem etLcLoom csram ptLssura cmtm lreuiume. </sLtLl> + tutmeLo true amoesreuiume (erruetLcLoom* setLcLoom); + + /// <emartusmuro> + /// lupoLo msm mtLaetm ri L etLcLoom'a ptLssura mr msm ouam ri tmLrmrta. + /// </emartusmuro> + /// <sLtLl oLlm="setLcLoom">dosem etLcLoom csram ptLssura cmtm mtLame. </sLtLl> + tutmeLo true amoettLame (erruetLcLoom* setLcLoom); + + /// <emartusmuro> + /// lupoLo ptLssura Ltm omuop sLoeme rtmt itrl rom etLcLoom mr Lormsmt etLcLoom. + /// </emartusmuro> + /// <sLtLl oLlm="setLcLoomutrl">dosem etLcLoom itrl csurs ptLssura cuoo om sLoeme rtmt. </sLtLl> + /// <sLtLl oLlm="setLcLoomir">dosem etLcLoom mr csurs ptLssura cuoo om sLoeme rtmt. </sLtLl> + tutmeLo true amoeaLoeitmtir (erruetLcLoom* setLcLoomutrl, erruetLcLoom* setLcLoomir); + + /// <emartusmuro> + /// lupoLo msm mtLaetm ri L etLcLoom'a ptLssura mr msm ouam ri tmLrmrta. + /// </emartusmuro> + /// <sLtLl oLlm="setLcLoom">dosem etLcLoom csram ptLssura cmtm mtLame. </sLtLl> + /// <sLtLl oLlm="sLtmomde">dosem ue ri sLtmom etLcLoom.</sLtLl> + tutmeLo true amoettLame (erruetLcLoom* setLcLoom, eemad::domeode sLtmomde); + + /// <emartusmuro> + /// lupoLo msm lreuiurLmuro ri L etLcLoom'a ptLssura mr msm ouam ri tmLrmrta. + /// </emartusmuro> + /// <sLtLl oLlm="setLcLoom">dosem etLcLoom csram ptLssura cmtm lreuiume. </sLtLl> + /// <sLtLl oLlm="sLtmomde">dosem ue ri sLtmom etLcLoom.</sLtLl> + tutmeLo true amoesreuiume (erruetLcLoom* setLcLoom, eemad::domeode sLtmomde); + + /// <emartusmuro> + /// lupoLo msm Leeumuro ri L etLcLoom'a ptLssura mr msm ouam ri tmLrmrta. + /// </emartusmuro> + /// <sLtLl oLlm="setLcLoom">dosem etLcLoom csram ptLssura cmtm Leeme. </sLtLl> + /// <sLtLl oLlm="sLtmomde">dosem ue ri sLtmom etLcLoom.</sLtLl> + /// <sLtLl oLlm="eLmLoLamnmt">dosem eLmLoLam sruommt rLam La iicr_nie.</sLtLl> + tutmeLo true amoeeeeme (erruetLcLoom* setLcLoom, eemad::domeode sLtmomde, eemad::iropnmt eLmLoLamnmt); + +stutLmm: + erruetLcLoomttmom (); + erruetLcLoomttmom (rroam erruetLcLoomttmom&); + true rsmtLmrt= (rroam erruetLcLoomttmom&); + ~erruetLcLoomttmom (); + + roLaa errudlsetLcLoomttmom* l_sdls; +}; + +#stLplL sLrd (srs) +#moeui // __eeeiecit_a diff --git a/tests/state_buf_multiple.direct.lll b/tests/state_buf_multiple.direct.lll new file mode 100644 index 0000000..ee336a4 --- /dev/null +++ b/tests/state_buf_multiple.direct.lll @@ -0,0 +1,104 @@ +/* + * This file is part of flex. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE. + */ + +%{ +/* A template scanner file to build "scanner.cc". + The scanner tests that we correctly initialize the state buffer + for long input buffers owned by code that calls yylex. + + This tests guards against reversions to CVE-2006-0459, + in particular when variable trailing context rules are used. + */ +#include <iostream> +#include <fstream> +#include <vector> + +#define ECHO +%} + +%option prefix="test" +%option noyywrap + +ID [_a-zA-Z]+[_0-9a-zA-Z]* + +BBC1 ([^(]*|"("[^(]*")") + +/** + * Balanced Bracketed Content. + * May not contain bracket, but if it does then it is balanced. + */ +BBC ({BBC1}*|"("{BBC1}*")") + +FPD "("{BBC}*")" + +%% + +{ID}/{FPD}\{ { + return 1234; +} + +%% + +std::vector<char> readFile(const char* filename) +{ + std::vector<char> contents; + std::ifstream in(filename, std::ios::in | std::ios::binary); + if (in) + { + in.seekg(0, std::ios::end); + size_t size = static_cast<size_t>(in.tellg()); + contents.resize(size + 2); + in.seekg(0, std::ios::beg); + in.read(contents.data(), size); + in.close(); + + contents[size + 0] = '\0'; + contents[size + 1] = '\0'; + } + else { + std::cerr << "*** Error: std::ifstream(" << filename << ") failed." << std::endl; + exit(-1); + } + return contents; +} + +int main(int argc, char** argv) +{ + if ( argc != 2 ) { + std::cerr << "*** Error: Must specify one filename." << std::endl; + exit(-1); + } + + std::vector<char> stm = readFile( argv[1] ); + test_scan_buffer(stm.data(), stm.size()); + + testlex(); + + std::vector<char> stm2(stm); + stm2.insert(stm2.end(), stm.begin(), stm.end()); + test_scan_buffer(stm2.data(), stm2.size()); + + testlex(); + + return 0; // All went well. +} diff --git a/tests/state_buf_multiple.direct.txt b/tests/state_buf_multiple.direct.txt new file mode 100644 index 0000000..858653c --- /dev/null +++ b/tests/state_buf_multiple.direct.txt @@ -0,0 +1,446 @@ +// +////////////////////////////////////////////////////////////////////////////// +// +// trsntupsm 2018 eemremad, dor. eoo tupsma tmamttme. +// +// tam ri msua arimcLtm ua aeommrm mr msm mmtla ri msm eemremad ourmoam +// Lptmmlmom strtueme Lm msm mulm ri uoamLooLmuro rt ercoorLe, rt csurs +// rmsmtcuam LrrrlsLouma msua arimcLtm uo mumsmt momrmtrour rt sLte rrsn irtl. +// +////////////////////////////////////////////////////////////////////////////// +// +#uioemi __eeeiecit_a +#emiuom __eeeiecit_a + +#uoroeem "torommrm.s" +#uoroeem "tortmtteom.s" +#uoroeem "eoue.s" +#stLplL sLrd (seas, 8) + + +roLaa errasremo; +roLaa erruetLcLoomitLuma; +roLaa erruirtoeetLc; +roLaa erruvumcsrtmetLc; +roLaa ereoleomomde; +roLaa ereotommoma; +roLaa erruetLclmtmLl; + +roLaa eetlp_ci_viecit erruetLcLoom : seoour ereoiommrm +{ +seoour: + + etev_ettieet_stsctel(erruetLcLoom); + + // trlouom msmam ioLpa uo msm tmmeto tLoem + // ri ammemmtuoemma irt miiurumorn ri ulsomlmomLmuro + // um ua tumLo msLm ui nre eam rmtmLuo Lasmrma ri msm + // end msLm msm rrttmrm ioLpa om eame. imsmtcuam msm + // euasoLn anamml lLn om uorrttmrmon rroiupetme irt + // aeoamiemom ptLssura. ddatrlsreoeiommrm putma + // ieoo Lrrmaa mr msm erru end, moLoouop msm eam + // ri etLc() Loe msm erru stulumutma mrpmmsmt. toLoouop + // msua lLdma msm moLortLmuro ri Lo rommrm lLtpuoLoon + // aorcmt. lr nre asreoe eam msm orcmam tLoem LsstrstuLmm. + // + // + moel lmmemmtuoemmauoLpa + { + // emiLeom etLcLoom, meam eama Lrpu stulumutma Loe erma orm eam + // omamme rLooa mr etLc() + detLcLoomcrom = 0, + + // ereotomumn emtutme roLaama (lLn tmieutm arlm asmruLo strrmaauop) + detLcLoomdaeotomumn = 1, + + // (oorrd mLoom tmrrte) tama omamuop oem erma orm amoe erco LeeumuroLo + // stulumutma. dm eama etLc() moroeautmon Loe lLdma or rLooa mr msm + // rmsmt erru stulumutma aers La rutrom rt asmoo + detLcLoomtamacmamuop = 2, + + // ere stli asmruin msua tLoem ui nre omam momumuma La L oorrd erma. + detLcLoomdatrlsreoeiommrm = 4, + + // etLcLoom asmruiuma csmo tumcsrtmetLc cuoo om rLoome. tlsorn + // smt-vumcsrtm rLrsuop ri tumcsrtmetLc pmrlmmtn. ea cmoo, msua + // etLcLoom erma orm eam crtoeetLc. + detLcLoomvumcdoemsmoemomvumcsrtmetLc = 8, + + // di msua momumn ua orm tuauoom (ereotomumn::tuauououmn()) + detLcLoomdadotuauoom = 16, + + // di L rrlsreoe rommrm sLa Lmmtuoemma um leam asmruin msua tLoem + detLcLoomaLaemmtuoemma = 32, + + // di msm pmrlmmtn nre moLortLmm ua emsmoemom ro msm tmpmomnsm; irt + // uoamLorm, ui nret etLcLoom etLca umamoi La L amm ri sronproa uo L + // "asLeme" tmpmo-lrem oem La L amm ri cutma uo "amLoeLte euasoLn", + // asmruin msua ioLp + detLcLoomempmoinsmemsmoemomrmrlmmtn = 64, + + // eulmoauroa tmrmutm asmruLo sLoeouop, omsLtuop auluoLton mr oorrda + detLcLoomdaeulmoauro = (detLcLoomdaeotomumn + detLcLoomdatrlsreoeiommrm + 128), + + // eocLna tmpmomtLmm etLcLoom + detLcLoomempmoetLc = 256, + + // etLcLoom sLa auopom omtmo ri emmLuo irt tmpmo mnsm + // derrulmLoeLteeuasoLn + detLcLoomlmLoeLteeuasoLnluopomiie = 512, + + // etLcLoom sLa auopom omtmo ri emmLuo irt tmpmo mnsm + // derrulsLemeeuasoLn + detLcLoomlsLemeeuasoLnluopomiie = 1024, + + // etLcLoom tmieutma tumcsrtmetLc om rLoome ro mtmtn tumc rsLopm. + detLcLoomvumcemsmoemomvumcsrtmetLc = 2048, + + // etLcLoom tmieutma eouiem tumcsrtmetLc moLortLmuro irt mLrs oorrd sLms. + detLcLoomcorrdemsmoemomvumcsrtmetLc = 4096, + + // etLcLoom ua Lo mommtoLo tmimtmorm + detLcLoomdatommtoLoemimtmorm = 8192, + + // etLcLoom cuoo orm om sormmme + detLcLoomcrmnormmLoom = 16384, + + // etLcLoom cuoo omtmt om etLco eoemt msm itl lmrsLoual + detLcLoomcrmeoorcitl = 32768, + // msua ua eame irt cusmrem sormmuop mr sei. + detLcLoomsmtpmtromtroiii = 65536 + }; + + + // ismam Ltm msm etLcLoom mnsma + // + moel etLcLoominsm + { + drmrlmmtn = 0, + deuamLomiupsm, + dnruomiupsm, + dlsrmiupsm, + deloumomiupsm, + dlrouecLrdptreoe, + drtLeumomcLrdptreoe, + ddlLpmcLrdptreoe, + drtreoenoLomcLrdptreoe, + dvumcsrtm, + dimoiupsm, + dldncLrdptreoe, + ddlLpmcLameiupsmuopcLrdptreoe + }; + +#stLplL cLtouop(seas) +#stLplL cLtouop(euaLoom: 4481) +#stLplL cLtouop(euaLoom: 4100) // eotmimtmorme irtlLo sLtLla uo eroortmtaum() + + etectiet2e_niei erruetLcLoom(); + etectiet2e_niei ~erruetLcLoom(); + + // urt emiLeom Lmmtuoemma + etectiet2e_niei _vdeitei eemad::tdom32 ammemmtuoemma (erruetLcLoomitLuma * mtLuma) ; + + // urt pmrlmmtn asLtme ommcmmo leomusom tumcsrtma + etectiet2e_niei _vdeitei eemad::crromLo crtoeetLc (erruirtoeetLc * ce) ; + + // urt tumcsrtm-asmruiur pmrlmmtn + etectiet2e_niei _vdeitei true tumcsrtmetLc (erruvumcsrtmetLc * te) ; + + // urt vumcdoemsmoemomvumcsrtmetLc rLrsuop + // tmmeto oumcuam rrlouoLmuro ri lmmemmtuoemmauoLpa + // irt orc, 3e rl roon uotmamupLmma detLcLoomempmoinsmemsmoemomrmrlmmtn + etectiet2e_niei _vdeitei eemad::tdom32 tumcsrtmetLcirpurLouoLpa (erruvumcsrtmetLc * te) ; + + // nmtauammom/mtLoaumom + tutmeLo eemad::crromLo uanmtauammom (true) rroam = 0; + tutmeLo ereoiommrmde ue (true) rroam = 0; + + // etLcLoom mnsm. + tutmeLo etLcLoominsm etLcLoominsm (true) rroam { tmmeto drmrlmmtn; } + + // osreamuoLpa Ltm uemomurLo mr msm is_sitltsivt cnLtLl cuoerca lmaaLpm. lmm slec irt msram ioLpa, msmn Ltm strtueme La ua. + // tmamm ua mtem ui troortmt ua tmammmuop rt omLtuop nret rommrm. + // tmmeto mtem ui nre cLom troortmt mr mtLrd nret rommrm, iLoam mr uportm um. + tutmeLo eemad::crromLo eroortmtaum (eemad::tiropnmt /*oleomomde*/, + eemad::tiropnmt /*osreamuoLpa*/, + eemad::crromLo /*oemamm*/) { tmmeto eemad::duLoam; } + + // lmm msm oreoea ri msm etLcLoom. emmeto iLoam ui msm etLcLoom sLa or + // oreoea, msm oreoea rLoorm om amm, rt msm lmmsre ua eoulsomlmomme. + tutmeLo orro oreoea (ereotommoma& /*oreoea*/) rroam { tmmeto iLoam; } + + // etLc amtmLl + etectiet2e_niei tutmeLo true ammetLclmtmLl (erruetLclmtmLl * slmtmLl); + etectiet2e_niei tutmeLo erruetLclmtmLl* etLclmtmLl (true) rroam; + +#stLplL cLtouop(srs) + +strmmrmme: + itumoe roLaa erruetLcLoomitmtteom; + + tutmeLo eemad::tdom32 aeolmmemmtuoemma (erruetLcLoomitLuma * mtLuma) = 0; + + tutmeLo eemad::crromLo aeoirtoeetLc (erruirtoeetLc * ce) = 0; + + tutmeLo true aeovumcsrtmetLc (erruvumcsrtmetLc * te) = 0; + + tutmeLo eemad::tdom32 aeovumcsrtmetLcirpurLouoLpa (erruvumcsrtmetLc * /*te*/) { tmmeto 0; } + +stutLmm: + itumoe roLaa erruetLcLoomerrmaartn; + + roLaa erruetLcLoomerrmaartn* l_serrmaartn; +}; + +/// <strsmtmn oLlm="tmtauroasmruiur" tLoem="=18.0.0.0" /> +/// +/// <emartusmuro> +/// erruetLcLoomitmtteom rtmtteoma L aeoamm ri etLc tmoLmme +/// rsmtLmuroa msLm erruetLcLoom roLaa asmruiuma. dm ua uommoeme +/// La L oLam roLaa irt roumoma csr cLom mr Lommt arlm rt Loo +/// omsLturt ri L putmo erruetLcLoom-emtutme roLaa. em msm oLam +/// omtmo, mLrs emiLeom ulsomlmomLmuro aulson rLooa msm +/// rrttmasroeuop lmmsre uo msm mLtpmm roLaa. +/// </emartusmuro> +roLaa erruetLcLoomitmtteom : seoour ereoitmtteom +{ +seoour: + etev_ettieet_stsctel(erruetLcLoomitmtteom); + + etectiet2e_niei erruetLcLoomitmtteom(); + /// <strsmtmn oLlm="tmtauroasmruiur" tLoem="=18.0.0.0" /> + /// + /// <emartusmuro> + /// itmtteoma erruetLcLoom::ammemmtuoemma lmmsre. + /// </emartusmuro> + /// <tmlLtda> + /// ism emiLeom ulsomlmomLmuro ri + /// erruetLcLoomitmtteom::ammemmtuoemma rLooa + /// erruetLcLoom::aeolmmemmtuoemma. + /// </tmlLtda> + /// <sLtLl oLlm="sleommrm">nruommt mr Lo ereoiommrm msLm msua + /// rtmtteom ua Lssoume LpLuoam.</sLtLl> + /// <sLtLl oLlm="mtLuma">nruommt mr msm ptLssura mtLuma.</sLtLl> + etectiet2e_niei tutmeLo eemad::tdom32 ammemmtuoemma (erruetLcLoom* sleommrm, erruetLcLoomitLuma * mtLuma); + /// <strsmtmn oLlm="tmtauroasmruiur" tLoem="=18.0.0.0" /> + /// + /// <emartusmuro> + /// itmtteoma erruetLcLoom::crtoeetLc. + /// </emartusmuro> + /// <sLtLl oLlm="sleommrm">nruommt mr Lo ereoiommrm msLm msua + /// rtmtteom ua Lssoume LpLuoam.</sLtLl> + /// <sLtLl oLlm="ce">nruommt mr msm ptLssura mtLuma.</sLtLl> + /// <tmlLtda> + /// ism emiLeom ulsomlmomLmuro ri erruetLcLoomitmtteom::crtoeetLc + /// rLooa msm strmmrmme tutmeLo erruetLcLoom::aeoirtoeetLc + /// lmmsre. + /// </tmlLtda> + etectiet2e_niei tutmeLo eemad::crromLo crtoeetLc (erruetLcLoom* sleommrm, erruirtoeetLc * ce); + /// <strsmtmn oLlm="tmtauroasmruiur" tLoem="=18.0.0.0" /> + /// + /// <emartusmuro> + /// itmtteoma erruetLcLoom::tumcsrtmetLc lmmsre. + /// </emartusmuro> + /// <tmlLtda> + /// emiLeom ulsomlmomLmuro ri erruetLcLoomitmtteom::tumcsrtmetLc + /// rLooa strmmrmme tutmeLo erruetLcLoom::aeovumcsrtmetLc lmmsre. + /// + /// </tmlLtda> + etectiet2e_niei tutmeLo true tumcsrtmetLc (erruetLcLoom* sleommrm, erruvumcsrtmetLc * te); + /// <strsmtmn oLlm="tmtauroasmruiur" tLoem="=18.0.0.0" /> + /// + /// <emartusmuro> + /// itmtteoma erruetLcLoom::tumcsrtmetLcirpurLouoLpa lmmsre. + /// </emartusmuro> + /// <tmlLtda> + /// ism emiLeom ulsomlmomLmuro ri erruetLcLoomitmtteom:: + /// tumcsrtmetLcirpurLouoLpa rLooa msm strmmrmme tutmeLo + /// erruetLcLoom:: aeovumcsrtmetLcirpurLouoLpa lmmsre. + /// </tmlLtda> + etectiet2e_niei tutmeLo eemad::tdom32 tumcsrtmetLcirpurLouoLpa (erruetLcLoom* sleommrm, erruvumcsrtmetLc * te); +}; + +/// <emartusmuro> +/// erruetLcLoomemLrmrt strtuema ormuiurLmuroa ri dmn erruetLcLoom- +/// tmoLmme mtmoma uoroeeuop ompuo/moe tmpmo, lreuiurLmuro, Loe +/// mtLaetm. toumoma csr emtutm itrl msua roLaa cuoo tmrmutm msmam +/// mtmoma Limmt tmpuammtuop msmut tmLrmrt cums +/// LrpuetLcLoomttmom->LeeemLrmrt(). +/// </emartusmuro> +roLaa etectiet2e_niei erruetLcLoomemLrmrt : seoour ereoiommrm +{ +seoour: + etev_ettieet_stsctel(erruetLcLoomemLrmrt); + + /// <emartusmuro> + /// ism ptLssura anamml csurs ua tmpmomtLmuop msm etLcLoom. + /// </emartusmuro> + moel empmouoLpa + { + d2eempmo, + d3eempmo + }; + + /// <emartusmuro> + /// isua mtmom aupoLoa msm ompuoouop ri L etLcLoom'a tmpmo. + /// </emartusmuro> + /// <sLtLl oLlm="setLcLoom">dosem etLcLoom Lorem mr om tmpmomtLmme.</sLtLl> + /// <sLtLl oLlm="ioLpa">dosem ptLssura anamml msLm cuoo smtirtl msm tmpmo. </sLtLl> + tutmeLo true ompuoempmo (erruetLcLoom* /*setLcLoom*/, empmouoLpa /*ioLpa*/) {} + + /// <emartusmuro> + /// isua mtmom aupoLoa msm moe ri L etLcLoom'a tmpmo. + /// </emartusmuro> + /// <sLtLl oLlm="setLcLoom">dosem etLcLoom msLm cLa tmpmomtLmme.</sLtLl> + /// <sLtLl oLlm="ioLpa">dosem ptLssura anamml msLm smtirtlme msm tmpmo.</sLtLl> + tutmeLo true moeempmo (erruetLcLoom* /*setLcLoom*/, empmouoLpa /*ioLpa*/) {} + + /// <emartusmuro> + /// isua mtmom aupoLoa msm lreuiurLmuro ri L etLcLoom'a ptLssura. + /// </emartusmuro> + /// <sLtLl oLlm="setLcLoom">dosem etLcLoom csram ptLssura cmtm lreuiume.</sLtLl> + tutmeLo true lreuiume (erruetLcLoom* /*setLcLoom*/) {} + + /// <emartusmuro> + /// isua mtmom aupoLoa msm mtLaetm ri L etLcLoom'a ptLssura. + /// </emartusmuro> + /// <sLtLl oLlm="setLcLoom">dosem etLcLoom csram ptLssura cmtm mtLame.</sLtLl> + tutmeLo true mtLame (erruetLcLoom* /*setLcLoom*/) {} + + /// <emartusmuro> + /// isua mtmom aupoLoa ptLssura Ltm omuop sLoeme rtmt itrl rom etLcLoom mr Lormsmt etLcLoom. + /// </emartusmuro> + /// <sLtLl oLlm="setLcLoomutrl">dosem etLcLoom itrl csurs ptLssura cuoo om sLoeme rtmt. </sLtLl> + /// <sLtLl oLlm="setLcLoomir">dosem etLcLoom mr csurs ptLssura cuoo om sLoeme rtmt. </sLtLl> + tutmeLo true sLoeitmtir (erruetLcLoom* /*setLcLoomutrl*/, erruetLcLoom* /*setLcLoomir*/) {} + + /// <emartusmuro> + /// isua mtmom aupoLoa msm mtLaetm ri L etLcLoom'a ptLssura. + /// </emartusmuro> + /// <sLtLl oLlm="setLcLoom">dosem etLcLoom csram ptLssura cmtm mtLame.</sLtLl> + /// <sLtLl oLlm="sLtmomde">dosem ue ri sLtmom etLcLoom.</sLtLl> + tutmeLo true mtLame(erruetLcLoom* /*setLcLoom*/, eemad::domeode /*sLtmomde*/) {} + + /// <emartusmuro> + /// isua mtmom aupoLoa msm lreuiurLmuro ri L etLcLoom'a ptLssura. + /// </emartusmuro> + /// <sLtLl oLlm="setLcLoom">dosem etLcLoom csram ptLssura cmtm lreuiume.</sLtLl> + /// <sLtLl oLlm="sLtmomde">dosem ue ri sLtmom etLcLoom.</sLtLl> + tutmeLo true lreuiume(erruetLcLoom* /*setLcLoom*/, eemad::domeode /*sLtmomde*/) {} + + /// <emartusmuro> + /// isua mtmom aupoLoa msm Leeumuro ri L etLcLoom'a ptLssura. + /// </emartusmuro> + /// <sLtLl oLlm="setLcLoom">dosem etLcLoom csram ptLssura cmtm Leeme. </sLtLl> + /// <sLtLl oLlm="sLtmomde">dosem ue ri sLtmom etLcLoom.</sLtLl> + /// <sLtLl oLlm="eLmLoLamnmt">dosem eLmLoLam sruommt rLam La iicr_nie.</sLtLl> + tutmeLo true Leeme(erruetLcLoom* /*setLcLoom*/, eemad::domeode /*sLtmomde*/, eemad::iropnmt /*eLmLoLamnmt*/) {} +}; + +/// <emartusmuro> +/// erruetLcLoomttmom lLoLpma L amm ri erruetLcLoomemLrmrta Loe amoea +/// ormuiurLmuroa mr msml csmo rmtmLuo mtmoma rrret. errmaa ua mstreps +/// L auopommro uoamLorm ri msua roLaa, LrpuetLcLoomttmom. toumoma ri +/// erruetLcLoomttmom iLoo uomr mstmm rLmmprtuma: +/// +/// 1. eon roumom uommtmamme uo lLduop eam ri erruetLcLoomemLrmrt leam +/// Lee Loe tmlrtm msmut tmLrmrt mstreps LeeemLrmrt/tmlrtmemLrmrt. +/// +/// 2. erruetLcLoom-emtutme roumoma lLn eam msua roLaa mr ormuin ptLssura +/// anammla ri lreuiurLmuroa Loe mtLaetma ri msmut ptLssura. +/// +/// 3. rtLssura anammla lLn eam msua roLaa mr ormuin uommtmamme ouammomta +/// (m.p. erruetLclmtmLl) ri tmpmo ompuo/moe mtmoma. +/// </emartusmuro> +#emiuom LrpuetLcLoomttmom (&erruetLcLoomttmom::uoamLorm()) + +roLaa erruetLcLoomttmom : seoour ereoiommrm +{ +seoour: + etev_ettieet_stsctel(erruetLcLoomttmom); + + + /// <emartusmuro> + /// isua amLmur lmmsre tmmetoa msm auopommro uoamLorm ri msua roLaa. tam msm LrpuetLcLoomttmom lLrtr irt rrotmoumorm. + /// </emartusmuro> + /// <tmmetoa>ism rom erruetLcLoomttmom.</tmmetoa> + etectiet2e_niei amLmur erruetLcLoomttmom& uoamLorm(); + + /// <emartusmuro> + /// eee msm tmLrmrt mr msm ouam ri tmLrmrta msLm Ltm ormuiume csmo etLcLoom mtmoma rrret. + /// </emartusmuro> + /// <sLtLl oLlm="semLrmrt">dosem tmLrmrt mr moLoom ormuiurLmuro ri etLcLoom mtmoma.</sLtLl> + tutmeLo true LeeemLrmrt (erruetLcLoomemLrmrt* semLrmrt); + + /// <emartusmuro> + /// emlrtm msm tmLrmrt itrl msm ouam ri tmLrmrta msLm Ltm ormuiume csmo etLcLoom mtmoma rrret. + /// </emartusmuro> + /// <sLtLl oLlm="semLrmrt">dosem tmLrmrt mr euaLoom ormuiurLmuro ri etLcLoom mtmoma. </sLtLl> + tutmeLo true tmlrtmemLrmrt (erruetLcLoomemLrmrt* semLrmrt); + + /// <emartusmuro> + /// lupoLo msm ompuoouop ri L etLcLoom'a tmpmo mr msm ouam ri tmLrmrta. + /// </emartusmuro> + /// <sLtLl oLlm="setLcLoom">dosem etLcLoom Lorem mr om tmpmomtLmme. </sLtLl> + /// <sLtLl oLlm="ioLpa">dosem ptLssura anamml msLm cuoo smtirtl msm tmpmo. </sLtLl> + tutmeLo true amoecmpuoempmo (erruetLcLoom* setLcLoom, erruetLcLoomemLrmrt::empmouoLpa ioLpa); + + /// <emartusmuro> + /// lupoLo msm moe ri L etLcLoom'a tmpmo mr msm ouam ri tmLrmrta. + /// </emartusmuro> + /// <sLtLl oLlm="setLcLoom">dosem etLcLoom msLm cLa tmpmomtLmme.</sLtLl> + /// <sLtLl oLlm="ioLpa">dosem ptLssura anamml msLm smtirtlme msm tmpmo.</sLtLl> + tutmeLo true amoetoeempmo (erruetLcLoom* setLcLoom, erruetLcLoomemLrmrt::empmouoLpa ioLpa); + + /// <emartusmuro> + /// lupoLo msm lreuiurLmuro ri L etLcLoom'a ptLssura mr msm ouam ri tmLrmrta. + /// </emartusmuro> + /// <sLtLl oLlm="setLcLoom">dosem etLcLoom csram ptLssura cmtm lreuiume. </sLtLl> + tutmeLo true amoesreuiume (erruetLcLoom* setLcLoom); + + /// <emartusmuro> + /// lupoLo msm mtLaetm ri L etLcLoom'a ptLssura mr msm ouam ri tmLrmrta. + /// </emartusmuro> + /// <sLtLl oLlm="setLcLoom">dosem etLcLoom csram ptLssura cmtm mtLame. </sLtLl> + tutmeLo true amoettLame (erruetLcLoom* setLcLoom); + + /// <emartusmuro> + /// lupoLo ptLssura Ltm omuop sLoeme rtmt itrl rom etLcLoom mr Lormsmt etLcLoom. + /// </emartusmuro> + /// <sLtLl oLlm="setLcLoomutrl">dosem etLcLoom itrl csurs ptLssura cuoo om sLoeme rtmt. </sLtLl> + /// <sLtLl oLlm="setLcLoomir">dosem etLcLoom mr csurs ptLssura cuoo om sLoeme rtmt. </sLtLl> + tutmeLo true amoeaLoeitmtir (erruetLcLoom* setLcLoomutrl, erruetLcLoom* setLcLoomir); + + /// <emartusmuro> + /// lupoLo msm mtLaetm ri L etLcLoom'a ptLssura mr msm ouam ri tmLrmrta. + /// </emartusmuro> + /// <sLtLl oLlm="setLcLoom">dosem etLcLoom csram ptLssura cmtm mtLame. </sLtLl> + /// <sLtLl oLlm="sLtmomde">dosem ue ri sLtmom etLcLoom.</sLtLl> + tutmeLo true amoettLame (erruetLcLoom* setLcLoom, eemad::domeode sLtmomde); + + /// <emartusmuro> + /// lupoLo msm lreuiurLmuro ri L etLcLoom'a ptLssura mr msm ouam ri tmLrmrta. + /// </emartusmuro> + /// <sLtLl oLlm="setLcLoom">dosem etLcLoom csram ptLssura cmtm lreuiume. </sLtLl> + /// <sLtLl oLlm="sLtmomde">dosem ue ri sLtmom etLcLoom.</sLtLl> + tutmeLo true amoesreuiume (erruetLcLoom* setLcLoom, eemad::domeode sLtmomde); + + /// <emartusmuro> + /// lupoLo msm Leeumuro ri L etLcLoom'a ptLssura mr msm ouam ri tmLrmrta. + /// </emartusmuro> + /// <sLtLl oLlm="setLcLoom">dosem etLcLoom csram ptLssura cmtm Leeme. </sLtLl> + /// <sLtLl oLlm="sLtmomde">dosem ue ri sLtmom etLcLoom.</sLtLl> + /// <sLtLl oLlm="eLmLoLamnmt">dosem eLmLoLam sruommt rLam La iicr_nie.</sLtLl> + tutmeLo true amoeeeeme (erruetLcLoom* setLcLoom, eemad::domeode sLtmomde, eemad::iropnmt eLmLoLamnmt); + +stutLmm: + erruetLcLoomttmom (); + erruetLcLoomttmom (rroam erruetLcLoomttmom&); + true rsmtLmrt= (rroam erruetLcLoomttmom&); + ~erruetLcLoomttmom (); + + roLaa errudlsetLcLoomttmom* l_sdls; +}; + +#stLplL sLrd (srs) +#moeui // __eeeiecit_a diff --git a/tests/testwrapper-direct.sh b/tests/testwrapper-direct.sh index 53d59a0..58b2843 100755 --- a/tests/testwrapper-direct.sh +++ b/tests/testwrapper-direct.sh @@ -4,6 +4,8 @@ set -euvx # testwrapper-direct.sh: run some specialized flex tests that care where # they're run from. +BINARY_DIR="." +SOURCE_DIR="." while getopts :b:s: OPTION ; do case $OPTION in |