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;
} 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_reset_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 void unlock(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_reset(iterator_t*);
extern void iter_destroy(iterator_t*);

View file

@ -82,6 +82,11 @@ void destroy(var v)
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)
{
meta_obj_t* obj = NULL;

View file

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