diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | awk.h | 1 | ||||
-rw-r--r-- | awkgram.c | 2 | ||||
-rw-r--r-- | awkgram.y | 2 | ||||
-rw-r--r-- | command.c | 14 | ||||
-rw-r--r-- | command.y | 14 | ||||
-rw-r--r-- | main.c | 6 | ||||
-rw-r--r-- | test/ChangeLog | 2 | ||||
-rw-r--r-- | test/Makefile.am | 4 | ||||
-rw-r--r-- | test/Makefile.in | 9 | ||||
-rw-r--r-- | test/Maketests | 5 | ||||
-rw-r--r-- | test/synerr3.awk | 1 | ||||
-rw-r--r-- | test/synerr3.ok | 5 |
13 files changed, 54 insertions, 18 deletions
@@ -4,6 +4,13 @@ * Makefile.am (EXTRA_DIST): Add ChangeLog.1 to the list. Ooops. * CheckList: Updated. + Fix core dump reported by Steve Kemp <steve@steve.org.uk>: + + * awk.h (errcount): Declare. + * awkgram.y (errcount): No longer static. + * command.y (dbg_errcount): Renamed from errcount.j + * main.c (catchsig, catchsegv): If errcount > 0, just exit, + don't abort. 2019-04-12 Arnold D. Robbins <arnold@skeeve.com> * configure.ac: Update version to 5.0.0. @@ -1116,6 +1116,7 @@ extern NODE *Null_field; extern NODE **fields_arr; extern int sourceline; extern char *source; +extern int errcount; extern int (*interpret)(INSTRUCTION *); /* interpreter routine */ extern NODE *(*make_number)(double); /* double instead of AWKNUM on purpose */ extern NODE *(*str2number)(NODE *); @@ -198,7 +198,7 @@ static int continue_allowed; /* kludge for continue */ static char *tokstart = NULL; static char *tok = NULL; static char *tokend; -static int errcount = 0; +int errcount = 0; extern char *source; extern int sourceline; @@ -154,7 +154,7 @@ static int continue_allowed; /* kludge for continue */ static char *tokstart = NULL; static char *tok = NULL; static char *tokend; -static int errcount = 0; +int errcount = 0; extern char *source; extern int sourceline; @@ -94,7 +94,7 @@ static bool want_nodeval = false; static int cmd_idx = -1; /* index of current command in cmd table */ static int repeat_idx = -1; /* index of last repeatable command in command table */ static CMDARG *arg_list = NULL; /* list of arguments */ -static long errcount = 0; +static long dbg_errcount = 0; static char *lexptr_begin = NULL; static bool in_commands = false; static int num_dim; @@ -1553,7 +1553,7 @@ yyreduce: case 5: #line 130 "command.y" /* yacc.c:1652 */ { - if (errcount == 0 && cmd_idx >= 0) { + if (dbg_errcount == 0 && cmd_idx >= 0) { Func_cmd cmdfunc; bool terminate = false; CMDARG *args; @@ -1621,7 +1621,7 @@ yyreduce: case 23: #line 219 "command.y" /* yacc.c:1652 */ { - if (errcount == 0) { + if (dbg_errcount == 0) { /* don't free arg_list; passed on to statement_list * non-terminal (empty rule action). See below. */ @@ -1788,7 +1788,7 @@ yyreduce: if (yyvsp[0] != NULL) num = yyvsp[0]->a_int; - if (errcount != 0) + if (dbg_errcount != 0) ; else if (in_commands) yyerror(_("Can't use command `commands' for breakpoint/watchpoint commands")); @@ -2774,7 +2774,7 @@ yyerror(const char *mesg, ...) vfprintf(out_fp, mesg, args); fprintf(out_fp, "\n"); va_end(args); - errcount++; + dbg_errcount++; repeat_idx = -1; } @@ -2796,9 +2796,9 @@ yylex(void) yylval = (CMDARG *) NULL; - if (errcount > 0 && lexptr_begin == NULL) { + if (dbg_errcount > 0 && lexptr_begin == NULL) { /* fake a new line */ - errcount = 0; + dbg_errcount = 0; return '\n'; } @@ -44,7 +44,7 @@ static bool want_nodeval = false; static int cmd_idx = -1; /* index of current command in cmd table */ static int repeat_idx = -1; /* index of last repeatable command in command table */ static CMDARG *arg_list = NULL; /* list of arguments */ -static long errcount = 0; +static long dbg_errcount = 0; static char *lexptr_begin = NULL; static bool in_commands = false; static int num_dim; @@ -128,7 +128,7 @@ line : nls | command nls { - if (errcount == 0 && cmd_idx >= 0) { + if (dbg_errcount == 0 && cmd_idx >= 0) { Func_cmd cmdfunc; bool terminate = false; CMDARG *args; @@ -217,7 +217,7 @@ set_want_nodeval eval_prologue : D_EVAL set_want_nodeval opt_param_list nls { - if (errcount == 0) { + if (dbg_errcount == 0) { /* don't free arg_list; passed on to statement_list * non-terminal (empty rule action). See below. */ @@ -335,7 +335,7 @@ command if ($2 != NULL) num = $2->a_int; - if (errcount != 0) + if (dbg_errcount != 0) ; else if (in_commands) yyerror(_("Can't use command `commands' for breakpoint/watchpoint commands")); @@ -1017,7 +1017,7 @@ yyerror(const char *mesg, ...) vfprintf(out_fp, mesg, args); fprintf(out_fp, "\n"); va_end(args); - errcount++; + dbg_errcount++; repeat_idx = -1; } @@ -1039,9 +1039,9 @@ yylex(void) yylval = (CMDARG *) NULL; - if (errcount > 0 && lexptr_begin == NULL) { + if (dbg_errcount > 0 && lexptr_begin == NULL) { /* fake a new line */ - errcount = 0; + dbg_errcount = 0; return '\n'; } @@ -1262,6 +1262,9 @@ catchsig(int sig) || sig == SIGBUS #endif ) { + if (errcount > 0) // assume a syntax error corrupted our data structures + exit(EXIT_FATAL); + set_loc(__FILE__, __LINE__); msg(_("fatal error: internal error")); /* fatal won't abort() if not compiled for debugging */ @@ -1279,6 +1282,9 @@ catchsig(int sig) static int catchsegv(void *fault_address, int serious) { + if (errcount > 0) // assume a syntax error corrupted our data structures + exit(EXIT_FATAL); + set_loc(__FILE__, __LINE__); msg(_("fatal error: internal error: segfault")); fflush(NULL); diff --git a/test/ChangeLog b/test/ChangeLog index ef4f632c..a6398975 100644 --- a/test/ChangeLog +++ b/test/ChangeLog @@ -1,6 +1,8 @@ 2019-04-18 Arnold D. Robbins <arnold@skeeve.com> * Makefile.am (EXTRA_DIST): Add ChangeLog.1 to the list. Ooops. + (synerr3): New test. + * synerr3.awk, synerr3.ok: New files. 2019-04-12 Arnold D. Robbins <arnold@skeeve.com> diff --git a/test/Makefile.am b/test/Makefile.am index a7e972af..8c794d62 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -1188,6 +1188,8 @@ EXTRA_DIST = \ synerr1.ok \ synerr2.awk \ synerr2.ok \ + synerr3.awk \ + synerr3.ok \ tailrecurse.awk \ tailrecurse.ok \ testext.ok \ @@ -1311,7 +1313,7 @@ BASIC_TESTS = \ scalar sclforin sclifin setrec0 setrec1 \ sigpipe1 sortempty sortglos spacere splitargv splitarr \ splitdef splitvar splitwht status-close strcat1 strnum1 strnum2 strtod \ - subamp subback subi18n subsepnm subslash substr swaplns synerr1 synerr2 \ + subamp subback subi18n subsepnm subslash substr swaplns synerr1 synerr2 synerr3 \ tailrecurse tradanch trailbs tweakfld \ uninit2 uninit3 uninit4 uninit5 uninitialized unterm uparrfs uplus \ wideidx wideidx2 widesub widesub2 widesub3 widesub4 wjposer1 \ diff --git a/test/Makefile.in b/test/Makefile.in index 305277e3..ee821c9a 100644 --- a/test/Makefile.in +++ b/test/Makefile.in @@ -1447,6 +1447,8 @@ EXTRA_DIST = \ synerr1.ok \ synerr2.awk \ synerr2.ok \ + synerr3.awk \ + synerr3.ok \ tailrecurse.awk \ tailrecurse.ok \ testext.ok \ @@ -1570,7 +1572,7 @@ BASIC_TESTS = \ scalar sclforin sclifin setrec0 setrec1 \ sigpipe1 sortempty sortglos spacere splitargv splitarr \ splitdef splitvar splitwht status-close strcat1 strnum1 strnum2 strtod \ - subamp subback subi18n subsepnm subslash substr swaplns synerr1 synerr2 \ + subamp subback subi18n subsepnm subslash substr swaplns synerr1 synerr2 synerr3 \ tailrecurse tradanch trailbs tweakfld \ uninit2 uninit3 uninit4 uninit5 uninitialized unterm uparrfs uplus \ wideidx wideidx2 widesub widesub2 widesub3 widesub4 wjposer1 \ @@ -3841,6 +3843,11 @@ synerr2: @AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ +synerr3: + @echo $@ + @AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ + @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ + tailrecurse: @echo $@ @AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ diff --git a/test/Maketests b/test/Maketests index e557cb2b..dadba2ee 100644 --- a/test/Maketests +++ b/test/Maketests @@ -1104,6 +1104,11 @@ synerr2: @AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ +synerr3: + @echo $@ + @AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ + @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ + tailrecurse: @echo $@ @AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ diff --git a/test/synerr3.awk b/test/synerr3.awk new file mode 100644 index 00000000..49b9e30a --- /dev/null +++ b/test/synerr3.awk @@ -0,0 +1 @@ +for (i = ) in foo bar baz diff --git a/test/synerr3.ok b/test/synerr3.ok new file mode 100644 index 00000000..b8b9dd89 --- /dev/null +++ b/test/synerr3.ok @@ -0,0 +1,5 @@ +gawk: synerr3.awk:1: for (i = ) in foo bar baz +gawk: synerr3.awk:1: ^ syntax error +gawk: synerr3.awk:1: for (i = ) in foo bar baz +gawk: synerr3.awk:1: ^ syntax error +EXIT CODE: 2 |