From 51b2d93125b90c023d8659163b657ce9717da5c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20=C4=8Cas?= Date: Tue, 28 May 2024 19:22:06 +0200 Subject: [PATCH] Fix issue where the use of a function pointer cast can trip -fsanitize=undefined on recent versions of clang --- src/addons/rules/api.c | 9 ++++++++- src/addons/system/system.c | 9 ++++++++- src/filter.c | 9 ++++++++- src/observer.c | 9 ++++++++- src/query.c | 9 ++++++++- 5 files changed, 40 insertions(+), 5 deletions(-) diff --git a/src/addons/rules/api.c b/src/addons/rules/api.c index 062537df7..f017edc27 100644 --- a/src/addons/rules/api.c +++ b/src/addons/rules/api.c @@ -103,6 +103,13 @@ void flecs_rule_fini( ecs_poly_free(rule, ecs_rule_t); } +/* ecs_poly_dtor_t-compatible wrapper */ +static +void flecs_rule_fini_poly(void *rule) +{ + flecs_rule_fini(rule); +} + void ecs_rule_fini( ecs_rule_t *rule) { @@ -137,7 +144,7 @@ ecs_rule_t* ecs_rule_init( } ecs_entity_t entity = const_desc->entity; - result->dtor = (ecs_poly_dtor_t)flecs_rule_fini; + result->dtor = flecs_rule_fini_poly; if (entity) { EcsPoly *poly = ecs_poly_bind(world, entity, ecs_rule_t); diff --git a/src/addons/system/system.c b/src/addons/system/system.c index c9bae6a88..ee5d21347 100644 --- a/src/addons/system/system.c +++ b/src/addons/system/system.c @@ -229,6 +229,13 @@ void flecs_system_fini(ecs_system_t *sys) { ecs_poly_free(sys, ecs_system_t); } +/* ecs_poly_dtor_t-compatible wrapper */ +static +void flecs_system_fini_poly(void *sys) +{ + flecs_system_fini(sys); +} + static void flecs_system_init_timer( ecs_world_t *world, @@ -281,7 +288,7 @@ ecs_entity_t ecs_system_init( poly->poly = system; system->world = world; - system->dtor = (ecs_poly_dtor_t)flecs_system_fini; + system->dtor = flecs_system_fini_poly; system->entity = entity; ecs_query_desc_t query_desc = desc->query; diff --git a/src/filter.c b/src/filter.c index db1d9ee6e..62ea385d5 100644 --- a/src/filter.c +++ b/src/filter.c @@ -1484,6 +1484,13 @@ void flecs_filter_fini( } } +/* ecs_poly_dtor_t-compatible wrapper */ +static +void flecs_filter_fini_poly(void *filter) +{ + flecs_filter_fini(filter); +} + void ecs_filter_fini( ecs_filter_t *filter) { @@ -1672,7 +1679,7 @@ ecs_filter_t* ecs_filter_init( f->variable_names[0] = NULL; f->iterable.init = flecs_filter_iter_init; - f->dtor = (ecs_poly_dtor_t)flecs_filter_fini; + f->dtor = flecs_filter_fini_poly; f->entity = entity; if (entity && (f->flags & EcsFilterOwnsStorage)) { diff --git a/src/observer.c b/src/observer.c index 7f85e7720..8d667fae5 100644 --- a/src/observer.c +++ b/src/observer.c @@ -825,6 +825,13 @@ int flecs_multi_observer_init( return -1; } +/* ecs_poly_dtor_t-compatible wrapper */ +static +void flecs_observer_fini_poly(void *observer) +{ + flecs_observer_fini(observer); +} + ecs_entity_t ecs_observer_init( ecs_world_t *world, const ecs_observer_desc_t *desc) @@ -846,7 +853,7 @@ ecs_entity_t ecs_observer_init( ecs_observer_t *observer = ecs_poly_new(ecs_observer_t); ecs_assert(observer != NULL, ECS_INTERNAL_ERROR, NULL); - observer->dtor = (ecs_poly_dtor_t)flecs_observer_fini; + observer->dtor = flecs_observer_fini_poly; /* Make writeable copy of filter desc so that we can set name. This will * make debugging easier, as any error messages related to creating the diff --git a/src/query.c b/src/query.c index 34d26ec91..ba082d7a3 100644 --- a/src/query.c +++ b/src/query.c @@ -2027,6 +2027,13 @@ void flecs_query_fini( ecs_poly_free(query, ecs_query_t); } +/* ecs_poly_dtor_t-compatible wrapper */ +static +void flecs_query_fini_poly(void *query) +{ + flecs_query_fini(query); +} + /* -- Public API -- */ ecs_query_t* ecs_query_init( @@ -2081,7 +2088,7 @@ ecs_query_t* ecs_query_init( } result->iterable.init = flecs_query_iter_init; - result->dtor = (ecs_poly_dtor_t)flecs_query_fini; + result->dtor = flecs_query_fini_poly; result->prev_match_count = -1; result->ctx = desc->ctx;