mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 12:23:04 +00:00
Prefer signed to unsigned integers
This patch contains more fixes to prefer signed to unsigned integer types, as modern tools like 'gcc -fsanitize=undefined' can check for signed integer overflow but not unsigned overflow. * NEWS: Document the API change. * boostrap.conf (gnulib_modules): Add intprops. * data/skeletons/glr.c: Include stddef.h and stdint.h, since this skeleton can assume C99 or later. (YYSIZEMAX): Now signed, and the minimum of SIZE_MAX and PTRDIFF_MAX. (yybool) [!__cplusplus]: Now signed (which is how bool behaves). (YYTRANSLATE): Avoid use of unsigned, and make the macro safe even for values greater than UINT_MAX. (yytnamerr, struct yyGLRState, struct yyGLRStateSet, struct yyGLRStack) (yyaddDeferredAction, yyinitStateSet, yyinitGLRStack) (yyexpandGLRStack, yymarkStackDeleted, yyremoveDeletes) (yyglrShift, yyglrShiftDefer, yy_reduce_print, yydoAction) (yyglrReduce, yysplitStack, yyreportTree, yycompressStack) (yyprocessOneStack, yyreportSyntaxError, yyrecoverSyntaxError) (yyparse, yy_yypstack, yypstack, yypdumpstack): * tests/input.at (Torturing the Scanner): Prefer ptrdiff_t to size_t. * data/skeletons/c++.m4 (b4_yytranslate_define): * src/AnnotationList.c (AnnotationList__computePredecessorAnnotations): * src/AnnotationList.h (AnnotationIndex): * src/InadequacyList.h (InadequacyListNodeCount): * src/closure.c (closure_new): * src/complain.c (error_message, complains, complain_indent) (complain_args, duplicate_directive, duplicate_rule_directive): * src/gram.c (nritems, ritem_print, grammar_dump): * src/ielr.c (ielr_compute_ritem_sees_lookahead_set) (ielr_item_has_lookahead, ielr_compute_annotation_lists) (ielr_compute_lookaheads): * src/location.c (columns, boundary_print, location_print): * src/muscle-tab.c (muscle_percent_define_insert) (muscle_percent_define_check_values): * src/output.c (prepare_rules, prepare_actions): * src/parse-gram.y (id, handle_require): * src/reader.c (record_merge_function_type, packgram): * src/reduce.c (nuseless_productions, nuseless_nonterminals) (inaccessable_symbols): * src/relation.c (relation_print): * src/scan-code.l (variant, variant_table_size, variant_count) (variant_add, get_at_spec, show_sub_message, show_sub_messages) (parse_ref): * src/scan-gram.l (<SC_ESCAPED_STRING,SC_ESCAPED_CHARACTER>) (scan_integer, convert_ucn_to_byte, handle_syncline): * src/scan-skel.l (at_complain): * src/symtab.c (complain_symbol_redeclared) (complain_semantic_type_redeclared, complain_class_redeclared) (symbol_class_set, complain_user_token_number_redeclared): * src/tables.c (conflict_tos, conflrow, conflict_table) (conflict_list, save_row, pack_vector): * tests/local.at (AT_YYLEX_DEFINE(c)): Prefer signed to unsigned integer. * data/skeletons/lalr1.cc (yy_lac_check_): * tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR): * tests/local.at (AT_YYLEX_DEFINE(c)): Omit now-unnecessary casts. * data/skeletons/location.cc (b4_location_define): * doc/bison.texi (Mfcalc Lexer, C++ position, C++ location): Prefer int to unsigned for line and column numbers. Change example to abort explicitly on memory exhaustion, and fix an off-by-one bug that led to undefined behavior. * data/skeletons/stack.hh (stack::operator[]): Also allow ptrdiff_t indexes. (stack::pop, slice::slice, slice::operator[]): Index arg is now ptrdiff_t, not int. (stack::ssize): New method. (slice::range_): Now ptrdiff_t, not int. * data/skeletons/yacc.c (b4_state_num_type): Remove. All uses replaced by b4_int_type. (YY_CONVERT_INT_BEGIN, YY_CONVERT_INT_END): New macros. (yylac, yyparse): Use them around conversions that -Wconversion would give false alarms about. Omit unnecessary casts. (yy_stack_print): Use int rather than unsigned, and omit a cast that doesn’t seem to be needed here any more. * examples/c++/variant.yy (yylex): * examples/c++/variant-11.yy (yylex): Omit no-longer-needed conversions to unsigned. * src/InadequacyList.c (InadequacyList__new_conflict): Don’t assume *node_count is unsigned. * src/output.c (muscle_insert_unsigned_table): Remove; no longer used.
This commit is contained in:
@@ -2662,7 +2662,7 @@ found, a pointer to that symbol is returned; otherwise zero is returned.
|
||||
|
||||
@comment file: mfcalc.y: 3
|
||||
@example
|
||||
#include <stdlib.h> /* malloc. */
|
||||
#include <stdlib.h> /* malloc, abort. */
|
||||
#include <string.h> /* strlen. */
|
||||
|
||||
@group
|
||||
@@ -2670,7 +2670,11 @@ symrec *
|
||||
putsym (char const *name, int sym_type)
|
||||
@{
|
||||
symrec *res = (symrec *) malloc (sizeof (symrec));
|
||||
if (!res)
|
||||
abort ();
|
||||
res->name = strdup (name);
|
||||
if (!res->name)
|
||||
abort ();
|
||||
res->type = sym_type;
|
||||
res->value.var = 0; /* Set value to 0 even if fun. */
|
||||
res->next = sym_table;
|
||||
@@ -2712,6 +2716,8 @@ operators in @code{yylex}.
|
||||
@comment file: mfcalc.y: 3
|
||||
@example
|
||||
#include <ctype.h>
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
@group
|
||||
int
|
||||
@@ -2748,23 +2754,25 @@ Bison generated a definition of @code{YYSTYPE} with a member named
|
||||
/* Char starts an identifier => read the name. */
|
||||
if (isalpha (c))
|
||||
@{
|
||||
/* Initially make the buffer long enough
|
||||
for a 40-character symbol name. */
|
||||
static size_t length = 40;
|
||||
static ptrdiff_t bufsize = 0;
|
||||
static char *symbuf = 0;
|
||||
@end group
|
||||
if (!symbuf)
|
||||
symbuf = malloc (length + 1);
|
||||
|
||||
int i = 0;
|
||||
ptrdiff_t i = 0;
|
||||
do
|
||||
@group
|
||||
@{
|
||||
/* If buffer is full, make it bigger. */
|
||||
if (i == length)
|
||||
if (bufsize <= i)
|
||||
@{
|
||||
length *= 2;
|
||||
symbuf = realloc (symbuf, length + 1);
|
||||
ptrdiff_t maxsize
|
||||
= (PTRDIFF_MAX < SIZE_MAX
|
||||
? PTRDIFF_MAX : SIZE_MAX);
|
||||
if ((maxsize - 40) / 2 < bufsize)
|
||||
abort ();
|
||||
bufsize = 2 * bufsize + 40;
|
||||
symbuf = realloc (symbuf, bufsize);
|
||||
if (!symbuf)
|
||||
abort ();
|
||||
@}
|
||||
/* Add this character to the buffer. */
|
||||
symbuf[i++] = c;
|
||||
@@ -11476,13 +11484,13 @@ classes will not be generated, and the user defined type will be used.
|
||||
@node C++ position
|
||||
@subsubsection C++ @code{position}
|
||||
|
||||
@deftypeop {Constructor} {position} {} position (std::string* @var{file} = nullptr, unsigned @var{line} = 1, unsigned @var{col} = 1)
|
||||
@deftypeop {Constructor} {position} {} position (std::string* @var{file} = nullptr, int @var{line} = 1, int @var{col} = 1)
|
||||
Create a @code{position} denoting a given point. Note that @code{file} is
|
||||
not reclaimed when the @code{position} is destroyed: memory managed must be
|
||||
handled elsewhere.
|
||||
@end deftypeop
|
||||
|
||||
@deftypemethod {position} {void} initialize (std::string* @var{file} = nullptr, unsigned @var{line} = 1, unsigned @var{col} = 1)
|
||||
@deftypemethod {position} {void} initialize (std::string* @var{file} = nullptr, int @var{line} = 1, int @var{col} = 1)
|
||||
Reset the position to the given values.
|
||||
@end deftypemethod
|
||||
|
||||
@@ -11493,7 +11501,7 @@ change it to @samp{@var{type}*} using @samp{%define filename_type
|
||||
"@var{type}"}.
|
||||
@end deftypeivar
|
||||
|
||||
@deftypeivar {position} {unsigned} line
|
||||
@deftypeivar {position} {int} line
|
||||
The line, starting at 1.
|
||||
@end deftypeivar
|
||||
|
||||
@@ -11502,7 +11510,7 @@ If @var{height} is not null, advance by @var{height} lines, resetting the
|
||||
column number. The resulting line number cannot be less than 1.
|
||||
@end deftypemethod
|
||||
|
||||
@deftypeivar {position} {unsigned} column
|
||||
@deftypeivar {position} {int} column
|
||||
The column, starting at 1.
|
||||
@end deftypeivar
|
||||
|
||||
@@ -11537,11 +11545,11 @@ Create a @code{Location} from the endpoints of the range.
|
||||
@end deftypeop
|
||||
|
||||
@deftypeop {Constructor} {location} {} location (const position& @var{pos} = position())
|
||||
@deftypeopx {Constructor} {location} {} location (std::string* @var{file}, unsigned @var{line}, unsigned @var{col})
|
||||
@deftypeopx {Constructor} {location} {} location (std::string* @var{file}, int @var{line}, int @var{col})
|
||||
Create a @code{Location} denoting an empty range located at a given point.
|
||||
@end deftypeop
|
||||
|
||||
@deftypemethod {location} {void} initialize (std::string* @var{file} = nullptr, unsigned @var{line} = 1, unsigned @var{col} = 1)
|
||||
@deftypemethod {location} {void} initialize (std::string* @var{file} = nullptr, int @var{line} = 1, int @var{col} = 1)
|
||||
Reset the location to an empty range at the given values.
|
||||
@end deftypemethod
|
||||
|
||||
|
||||
Reference in New Issue
Block a user