improve iter_make() and fix is_rtti_obj() cause address sanitize false error report
This commit is contained in:
parent
a17ddb9fb7
commit
00080a95f3
4 changed files with 16 additions and 5 deletions
|
|
@ -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*);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
10
src/iter.c
10
src/iter.c
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue