various: Work around a few of the clang ubsan diagnostics.
These fixes do not make me proud. Signed-off-by: Jeff Epler <jepler@gmail.com>
This commit is contained in:
parent
141f7d0c35
commit
2822d83aff
7 changed files with 30 additions and 25 deletions
2
py/bc.c
2
py/bc.c
|
|
@ -147,7 +147,7 @@ static void mp_setup_code_state_helper(mp_code_state_t *code_state, size_t n_arg
|
|||
// zero out the local stack to begin with
|
||||
memset(code_state_state, 0, n_state * sizeof(*code_state->state));
|
||||
|
||||
const mp_obj_t *kwargs = args + n_args;
|
||||
const mp_obj_t *kwargs = args ? args + n_args : NULL;
|
||||
|
||||
// var_pos_kw_args points to the stack where the var-args tuple, and var-kw dict, should go (if they are needed)
|
||||
mp_obj_t *var_pos_kw_args = &code_state_state[n_state - 1 - n_pos_args - n_kwonly_args];
|
||||
|
|
|
|||
|
|
@ -910,7 +910,8 @@ mp_lexer_t *mp_lexer_new_from_fd(qstr filename, int fd, bool close_fd) {
|
|||
|
||||
#endif
|
||||
|
||||
void mp_lexer_free(mp_lexer_t *lex) {
|
||||
void mp_lexer_free(void *lex_in) {
|
||||
mp_lexer_t *lex = lex_in;
|
||||
if (lex) {
|
||||
lex->reader.close(lex->reader.data);
|
||||
vstr_clear(&lex->vstr);
|
||||
|
|
|
|||
|
|
@ -198,7 +198,7 @@ mp_lexer_t *mp_lexer_new_from_file(qstr filename);
|
|||
mp_lexer_t *mp_lexer_new_from_fd(qstr filename, int fd, bool close_fd);
|
||||
#endif
|
||||
|
||||
void mp_lexer_free(mp_lexer_t *lex);
|
||||
void mp_lexer_free(void *lex);
|
||||
void mp_lexer_to_next(mp_lexer_t *lex);
|
||||
|
||||
#endif // MICROPY_INCLUDED_PY_LEXER_H
|
||||
|
|
|
|||
34
py/map.c
34
py/map.c
|
|
@ -190,23 +190,25 @@ mp_map_elem_t *MICROPY_WRAP_MP_MAP_LOOKUP(mp_map_lookup)(mp_map_t * map, mp_obj_
|
|||
|
||||
// if the map is an ordered array then we must do a brute force linear search
|
||||
if (map->is_ordered) {
|
||||
for (mp_map_elem_t *elem = &map->table[0], *top = &map->table[map->used]; elem < top; elem++) {
|
||||
if (elem->key == index || (!compare_only_ptrs && mp_obj_equal(elem->key, index))) {
|
||||
#if MICROPY_PY_COLLECTIONS_ORDEREDDICT
|
||||
if (MP_UNLIKELY(lookup_kind == MP_MAP_LOOKUP_REMOVE_IF_FOUND)) {
|
||||
// remove the found element by moving the rest of the array down
|
||||
mp_obj_t value = elem->value;
|
||||
--map->used;
|
||||
memmove(elem, elem + 1, (top - elem - 1) * sizeof(*elem));
|
||||
// put the found element after the end so the caller can access it if needed
|
||||
// note: caller must NULL the value so the GC can clean up (e.g. see dict_get_helper).
|
||||
elem = &map->table[map->used];
|
||||
elem->key = MP_OBJ_NULL;
|
||||
elem->value = value;
|
||||
if (map->used) {
|
||||
for (mp_map_elem_t *elem = &map->table[0], *top = &map->table[map->used]; elem < top; elem++) {
|
||||
if (elem->key == index || (!compare_only_ptrs && mp_obj_equal(elem->key, index))) {
|
||||
#if MICROPY_PY_COLLECTIONS_ORDEREDDICT
|
||||
if (MP_UNLIKELY(lookup_kind == MP_MAP_LOOKUP_REMOVE_IF_FOUND)) {
|
||||
// remove the found element by moving the rest of the array down
|
||||
mp_obj_t value = elem->value;
|
||||
--map->used;
|
||||
memmove(elem, elem + 1, (top - elem - 1) * sizeof(*elem));
|
||||
// put the found element after the end so the caller can access it if needed
|
||||
// note: caller must NULL the value so the GC can clean up (e.g. see dict_get_helper).
|
||||
elem = &map->table[map->used];
|
||||
elem->key = MP_OBJ_NULL;
|
||||
elem->value = value;
|
||||
}
|
||||
#endif
|
||||
MAP_CACHE_SET(index, elem - map->table);
|
||||
return elem;
|
||||
}
|
||||
#endif
|
||||
MAP_CACHE_SET(index, elem - map->table);
|
||||
return elem;
|
||||
}
|
||||
}
|
||||
#if MICROPY_PY_COLLECTIONS_ORDEREDDICT
|
||||
|
|
|
|||
|
|
@ -214,7 +214,7 @@ char *vstr_null_terminated_str(vstr_t *vstr);
|
|||
void vstr_add_byte(vstr_t *vstr, byte v);
|
||||
void vstr_add_char(vstr_t *vstr, unichar chr);
|
||||
void vstr_add_str(vstr_t *vstr, const char *str);
|
||||
void vstr_add_strn(vstr_t *vstr, const char *str, size_t len);
|
||||
void vstr_add_strn(void *vstr, const char *str, size_t len);
|
||||
void vstr_ins_byte(vstr_t *vstr, size_t byte_pos, byte b);
|
||||
void vstr_ins_char(vstr_t *vstr, size_t char_pos, unichar chr);
|
||||
void vstr_cut_head_bytes(vstr_t *vstr, size_t bytes_to_cut);
|
||||
|
|
|
|||
8
py/vm.c
8
py/vm.c
|
|
@ -75,7 +75,7 @@
|
|||
} while (0)
|
||||
|
||||
#define DECODE_SLABEL \
|
||||
size_t slab; \
|
||||
int slab; \
|
||||
do { \
|
||||
if (ip[0] & 0x80) { \
|
||||
slab = ((ip[0] & 0x7f) | (ip[1] << 7)) - 0x4000; \
|
||||
|
|
@ -792,7 +792,7 @@ unwind_jump:;
|
|||
if (*(sp - MP_OBJ_ITER_BUF_NSLOTS + 1) == MP_OBJ_NULL) {
|
||||
obj = *(sp - MP_OBJ_ITER_BUF_NSLOTS + 2);
|
||||
} else {
|
||||
obj = MP_OBJ_FROM_PTR(&sp[-MP_OBJ_ITER_BUF_NSLOTS + 1]);
|
||||
obj = MP_OBJ_FROM_PTR(sp - MP_OBJ_ITER_BUF_NSLOTS + 1);
|
||||
}
|
||||
mp_obj_t value = mp_iternext_allow_raise(obj);
|
||||
if (value == MP_OBJ_STOP_ITERATION) {
|
||||
|
|
@ -821,7 +821,7 @@ unwind_jump:;
|
|||
ENTRY(MP_BC_BUILD_TUPLE): {
|
||||
MARK_EXC_IP_SELECTIVE();
|
||||
DECODE_UINT;
|
||||
sp -= unum - 1;
|
||||
sp = sp - unum + 1;
|
||||
SET_TOP(mp_obj_new_tuple(unum, sp));
|
||||
DISPATCH();
|
||||
}
|
||||
|
|
@ -829,7 +829,7 @@ unwind_jump:;
|
|||
ENTRY(MP_BC_BUILD_LIST): {
|
||||
MARK_EXC_IP_SELECTIVE();
|
||||
DECODE_UINT;
|
||||
sp -= unum - 1;
|
||||
sp = sp - unum + 1;
|
||||
SET_TOP(mp_obj_new_list(unum, sp));
|
||||
DISPATCH();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -177,7 +177,9 @@ void vstr_add_str(vstr_t *vstr, const char *str) {
|
|||
vstr_add_strn(vstr, str, strlen(str));
|
||||
}
|
||||
|
||||
void vstr_add_strn(vstr_t *vstr, const char *str, size_t len) {
|
||||
// The first parameter is declared as `void*` so that it can be used as a `print_strn` function.
|
||||
void vstr_add_strn(void *vstr_in, const char *str, size_t len) {
|
||||
vstr_t *vstr = vstr_in;
|
||||
vstr_ensure_extra(vstr, len);
|
||||
memmove(vstr->buf + vstr->len, str, len);
|
||||
vstr->len += len;
|
||||
|
|
|
|||
Loading…
Reference in a new issue