diagnostics: fix invalid error message indentation

https://lists.gnu.org/archive/html/bison-patches/2019-08/msg00007.html

When Bison is started with a flag that suppresses warning messages, the
error_message() function can produce a few gigabytes of indentation
because of a dangling pointer.

* src/complain.c (error_message): Don't reset indent_ptr here, but...
(complain_indent): here.
* tests/diagnostics.at (Indentation with message suppression): Check
this case.
This commit is contained in:
László Várady
2019-08-09 14:24:14 +02:00
committed by Akim Demaille
parent 47262c36bb
commit e63811dd86
4 changed files with 36 additions and 1 deletions

4
NEWS
View File

@@ -2,6 +2,10 @@ GNU Bison NEWS
* Noteworthy changes in release ?.? (????-??-??) [?] * Noteworthy changes in release ?.? (????-??-??) [?]
** Bug fixes
In some cases, when warnings are disabled, bison could emit tons of white
spaces as diagnostics.
* Noteworthy changes in release 3.4.1 (2019-05-22) [stable] * Noteworthy changes in release 3.4.1 (2019-05-22) [stable]

1
THANKS
View File

@@ -95,6 +95,7 @@ Keith Browne kbrowne@legato.com
Ken Moffat zarniwhoop@ntlworld.com Ken Moffat zarniwhoop@ntlworld.com
Kiyoshi Kanazawa yoi_no_myoujou@yahoo.co.jp Kiyoshi Kanazawa yoi_no_myoujou@yahoo.co.jp
Laurent Mascherpa laurent.mascherpa@epita.fr Laurent Mascherpa laurent.mascherpa@epita.fr
László Várady laszlo.varady93@gmail.com
Lie Yan lie.yan@kaust.edu.sa Lie Yan lie.yan@kaust.edu.sa
Magnus Fromreide magfr@lysator.liu.se Magnus Fromreide magfr@lysator.liu.se
Marc Autret autret_m@epita.fr Marc Autret autret_m@epita.fr

View File

@@ -416,7 +416,6 @@ error_message (const location *loc, warnings flags, severity sever,
*indent_ptr = pos; *indent_ptr = pos;
else if (*indent_ptr > pos) else if (*indent_ptr > pos)
fprintf (stderr, "%*s", *indent_ptr - pos, ""); fprintf (stderr, "%*s", *indent_ptr - pos, "");
indent_ptr = NULL;
} }
const char* style = severity_style (sever); const char* style = severity_style (sever);
@@ -487,6 +486,7 @@ complain_indent (location const *loc, warnings flags, unsigned *indent,
va_start (args, message); va_start (args, message);
complains (loc, flags, message, args); complains (loc, flags, message, args);
va_end (args); va_end (args);
indent_ptr = NULL;
} }
void void

View File

@@ -242,3 +242,33 @@ input.y: <warning>warning:</warning> fix-its can be applied. Rerun with option
m4_popdef([AT_TEST]) m4_popdef([AT_TEST])
## -------------------------------------- ##
## Indentation with message suppression. ##
## -------------------------------------- ##
AT_SETUP([[Indentation with message suppression]])
# https://lists.gnu.org/archive/html/bug-bison/2019-08/msg00002.html
AT_DATA([[input.y]],
[[%define api.pure
%pure-parser
%error-verbose
%%
exp : '0'
]])
AT_BISON_CHECK([[-fcaret -Wno-other input.y]], [0], [],
[[input.y:2.1-12: warning: deprecated directive, use '%define api.pure' [-Wdeprecated]
2 | %pure-parser
| ^~~~~~~~~~~~
input.y:3.1-14: warning: deprecated directive, use '%define parse.error verbose' [-Wdeprecated]
3 | %error-verbose
| ^~~~~~~~~~~~~~
]])
AT_CLEANUP