improve iter_make() and fix is_rtti_obj() cause address sanitize false error report

This commit is contained in:
Rongsong Shen 2026-02-02 10:42:28 +08:00
parent a17ddb9fb7
commit 00080a95f3
4 changed files with 16 additions and 5 deletions

View file

@ -98,7 +98,7 @@ typedef struct {
var data; var data;
} iterator_t; } iterator_t;
typedef int (*iter_make_fn_t)(iterator_t*); typedef int (*iter_make_fn_t)(iterator_t*, va_list);
typedef int (*iter_next_fn_t)(iterator_t*, void**); typedef int (*iter_next_fn_t)(iterator_t*, void**);
typedef int (*iter_reset_fn_t)(iterator_t*); typedef int (*iter_reset_fn_t)(iterator_t*);
typedef void (*iter_destroy_fn_t)(iterator_t*); typedef void (*iter_destroy_fn_t)(iterator_t*);
@ -165,7 +165,7 @@ extern int is_rtti_obj(var);
extern int lock(var, uint64_t); extern int lock(var, uint64_t);
extern void unlock(var); extern void unlock(var);
extern char* toString(var, ...); extern char* toString(var, ...);
extern int iter_make(iterator_t*, var); extern int iter_make(iterator_t*, var,...);
extern int iter_next(iterator_t*, void**); extern int iter_next(iterator_t*, void**);
extern int iter_reset(iterator_t*); extern int iter_reset(iterator_t*);
extern void iter_destroy(iterator_t*); extern void iter_destroy(iterator_t*);

View file

@ -82,6 +82,11 @@ void destroy(var v)
return; return;
} }
/* disable address sanitize as it's a possible case that calculated address of
* obj may not be valid */
#if defined(__GNUC__)
__attribute__((no_sanitize("address")))
#endif
int is_rtti_obj(var v) int is_rtti_obj(var v)
{ {
meta_obj_t* obj = NULL; meta_obj_t* obj = NULL;

View file

@ -4,10 +4,12 @@
#include "rtti.h" #include "rtti.h"
int iter_make(iterator_t* it, var v) int iter_make(iterator_t* it, var v, ...)
{ {
meta_obj_t* obj = NULL; meta_obj_t* obj = NULL;
iter_make_fn_t method = NULL; iter_make_fn_t method = NULL;
va_list ap;
int rc = 0;
if (it == NULL) { if (it == NULL) {
return -EINVAL; return -EINVAL;
@ -23,10 +25,14 @@ int iter_make(iterator_t* it, var v)
return -EINVAL; return -EINVAL;
} }
va_start(ap, v);
memset(it, 0x0, sizeof(*it)); memset(it, 0x0, sizeof(*it));
it->obj = obj; it->obj = obj;
return method(it); rc = method(it, ap);
va_end(ap);
return rc;
} }
int iter_next(iterator_t* it, void** data) int iter_next(iterator_t* it, void** data)

View file

@ -44,7 +44,7 @@ static void my_array_destroy(meta_obj_t* obj)
} }
} }
static int my_array_make_iter(iterator_t* iter) static int my_array_make_iter(iterator_t* iter, va_list ap)
{ {
iter->data = (void*)(long)0; iter->data = (void*)(long)0;