maint: port to strict C function type checking

Violation of C standard detected by clang -fsanitize=undefined
with clang 19.1.7 on Fedora 41 x86-64.
* src/counterexample.c (si_bfs_free):
* src/files.c (prefix_map_free, add_prefix_map):
* src/fixits.c (fixit_cmp, fixit_free, fixits_register):
(expand_to_conflict, nonunifying_shift_path)
(search_state_free_children, search_state_free, ssb_free)
(ssb_hasher, ssb_comp, ssb_equals, visited_hasher)
(visited_comparator, ssb_append, unifying_example):
* src/lssi.c (lssi_free, lssi_hasher, lssi_comparator)
(shortest_path_from_start):
* src/parse-simulation.c (free_parse_state)
(parse_state_list_new, parser_pop):
* src/state-item.c (hash_pair_hasher, hash_pair_comparator)
(hash_pair_free, hash_pair_table_create):
Avoid undefined behavior in C, which does not allow you to cast a
function pointer to some other function type and then call it via
that other type.  Instead, use functions with correct types
according to the C standard, and cast their parameters.
* src/getargs.c (xargmatch_fn): Return int const, not int, to
match what ARGMATCH_DEFINE_GROUP does.  In all uses of
ARGMATCH_DEFINE_GROUP, say that they return int, to match
xargmatch_fn.
(FLAGS_ARGMATCH): Do not cast function pointer.
* src/parse-simulation.c (vc_derivation_list_append): New function.
* src/system.h (deconst): New static function.
This commit is contained in:
Paul Eggert
2025-03-13 13:38:21 -07:00
parent 6a4b3240cf
commit d7527048a8
9 changed files with 90 additions and 70 deletions

View File

@@ -50,8 +50,9 @@ new_lssi (state_item_number si, lssi *p, bitset l, bool free_l)
}
static void
lssi_free (lssi *sn)
lssi_free (void *vsn)
{
lssi *sn = vsn;
if (sn == NULL)
return;
if (sn->free_lookahead)
@@ -60,8 +61,9 @@ lssi_free (lssi *sn)
}
static size_t
lssi_hasher (lssi *sn, size_t max)
lssi_hasher (void const *vsn, size_t max)
{
lssi const *sn = vsn;
size_t hash = sn->si;
bitset_iterator biter;
symbol_number syn;
@@ -71,8 +73,10 @@ lssi_hasher (lssi *sn, size_t max)
}
static bool
lssi_comparator (lssi *s1, lssi *s2)
lssi_comparator (void const *vs1, void const *vs2)
{
lssi const *s1 = vs1;
lssi const *s2 = vs2;
if (s1->si == s2->si)
{
if (s1->lookahead == s2->lookahead)
@@ -154,11 +158,8 @@ state_item_list
shortest_path_from_start (state_item_number target, symbol_number next_sym)
{
bitset eligible = eligible_state_items (&state_items[target]);
Hash_table *visited = hash_initialize (32,
NULL,
(Hash_hasher) lssi_hasher,
(Hash_comparator) lssi_comparator,
(Hash_data_freer) lssi_free);
Hash_table *visited = hash_initialize (32, NULL, lssi_hasher,
lssi_comparator, lssi_free);
bitset il = bitset_create (nsyms, BITSET_FIXED);
bitset_set (il, 0);
lssi *init = new_lssi (0, NULL, il, true);