diff options
| author | Jeff Epler <jepler@gmail.com> | 2025-06-21 15:40:38 +0200 |
|---|---|---|
| committer | Damien George <damien@micropython.org> | 2025-07-25 10:56:57 +1000 |
| commit | d0d111356f36373bdda387626162f60b38f2177a (patch) | |
| tree | 54dc6dd3c76b64a24aaeeb4e5fcf8ae187c68210 /py | |
| parent | 519cba4d050e0c0bf69039908ef255b421d8ce57 (diff) | |
py: Fix mp_printf integer size mismatches.
The type of the argument must match the format string. Add casts to ensure
that they do.
It's possible that casting from `size_t` to `unsigned` loses the correct
values by masking off upper bits, but it seems likely that the quantities
involved in practice are small enough that the `%u` formatter (32 bits on
most platforms, 16 on pic16bit) will in fact hold the correct value.
The alternative, casting to a wider type, adds code size.
These locations were found using an experimental gcc plugin for `mp_printf`
error checking, cross-building for x64 windows on Linux.
In one case there was already a cast, but it was written incorrectly and
did not have the intended effect.
Signed-off-by: Jeff Epler <jepler@gmail.com>
Diffstat (limited to 'py')
| -rw-r--r-- | py/gc.c | 2 | ||||
| -rw-r--r-- | py/modmicropython.c | 2 |
2 files changed, 2 insertions, 2 deletions
@@ -1202,7 +1202,7 @@ void gc_dump_alloc_table(const mp_print_t *print) { } if (bl2 - bl >= 2 * DUMP_BYTES_PER_LINE) { // there are at least 2 lines containing only free blocks, so abbreviate their printing - mp_printf(print, "\n (%u lines all free)", (uint)(bl2 - bl) / DUMP_BYTES_PER_LINE); + mp_printf(print, "\n (%u lines all free)", (uint)((bl2 - bl) / DUMP_BYTES_PER_LINE)); bl = bl2 & (~(DUMP_BYTES_PER_LINE - 1)); if (bl >= area->gc_alloc_table_byte_len * BLOCKS_PER_ATB) { // got to end of heap diff --git a/py/modmicropython.c b/py/modmicropython.c index d1a687f10..4d676cb4a 100644 --- a/py/modmicropython.c +++ b/py/modmicropython.c @@ -98,7 +98,7 @@ static mp_obj_t mp_micropython_qstr_info(size_t n_args, const mp_obj_t *args) { size_t n_pool, n_qstr, n_str_data_bytes, n_total_bytes; qstr_pool_info(&n_pool, &n_qstr, &n_str_data_bytes, &n_total_bytes); mp_printf(&mp_plat_print, "qstr pool: n_pool=%u, n_qstr=%u, n_str_data_bytes=%u, n_total_bytes=%u\n", - n_pool, n_qstr, n_str_data_bytes, n_total_bytes); + (uint)n_pool, (uint)n_qstr, (uint)n_str_data_bytes, (uint)n_total_bytes); if (n_args == 1) { // arg given means dump qstr data qstr_dump_data(); |
