bison: check for int overflow when scanning

* src/scan-gram.l: Include errno.h, for errno.
(scan_integer, handle_syncline): Check for integer overflow.
* tests/input.at (too-large.y): Adjust to match new diagnostics.
This commit is contained in:
Paul Eggert
2019-10-17 11:33:54 -07:00
parent 15c1b913cf
commit 052215a138
2 changed files with 8 additions and 2 deletions

View File

@@ -21,6 +21,8 @@
%option prefix="gram_" outfile="lex.yy.c" %option prefix="gram_" outfile="lex.yy.c"
%{ %{
#include <errno.h>
#include <c-ctype.h> #include <c-ctype.h>
#include <mbswidth.h> #include <mbswidth.h>
#include <quote.h> #include <quote.h>
@@ -818,9 +820,10 @@ scan_integer (char const *number, int base, location loc)
complain (&loc, Wyacc, complain (&loc, Wyacc,
_("POSIX Yacc does not support hexadecimal literals")); _("POSIX Yacc does not support hexadecimal literals"));
errno = 0;
long num = strtol (number, NULL, base); long num = strtol (number, NULL, base);
if (! (0 <= num && num <= INT_MAX)) if (! (0 <= num && num <= INT_MAX && errno == 0))
{ {
complain (&loc, complaint, _("integer out of range: %s"), complain (&loc, complaint, _("integer out of range: %s"),
quote (number)); quote (number));
@@ -896,8 +899,9 @@ static void
handle_syncline (char *args, location loc) handle_syncline (char *args, location loc)
{ {
char *file; char *file;
errno = 0;
long lineno = strtol (args, &file, 10); long lineno = strtol (args, &file, 10);
if (! (0 <= lineno && lineno <= INT_MAX)) if (! (0 <= lineno && lineno <= INT_MAX && errno == 0))
{ {
complain (&loc, Wother, _("line number overflow")); complain (&loc, Wother, _("line number overflow"));
lineno = INT_MAX; lineno = INT_MAX;

View File

@@ -1523,7 +1523,9 @@ start: TOO_LARGE_DEC TOO_LARGE_HEX
AT_BISON_CHECK([too-large.y], [1], [], AT_BISON_CHECK([too-large.y], [1], [],
[[too-large.y:9.22-42: error: integer out of range: '999999999999999999999' [[too-large.y:9.22-42: error: integer out of range: '999999999999999999999'
too-large.y:9.22-42: error: user token number of TOO_LARGE_DEC too large
too-large.y:10.24-44: error: integer out of range: '0xFFFFFFFFFFFFFFFFFFF' too-large.y:10.24-44: error: integer out of range: '0xFFFFFFFFFFFFFFFFFFF'
too-large.y:10.24-44: error: user token number of TOO_LARGE_HEX too large
]]) ]])
AT_BISON_OPTION_POPDEFS AT_BISON_OPTION_POPDEFS