diff options
author | Antonio Borneo <borneo.antonio@gmail.com> | 2022-11-04 00:32:20 +0100 |
---|---|---|
committer | Antonio Borneo <borneo.antonio@gmail.com> | 2022-11-11 20:23:13 +0000 |
commit | fb23c9c10bd161ac05b85e73ad91676063592b96 (patch) | |
tree | d4d184ce54ee2cbb6d1aa2b484de16b902489045 | |
parent | 09731b69a6f50c7e0e2f6fa0ba245374034217cb (diff) | |
download | riscv-openocd-fb23c9c10bd161ac05b85e73ad91676063592b96.zip riscv-openocd-fb23c9c10bd161ac05b85e73ad91676063592b96.tar.gz riscv-openocd-fb23c9c10bd161ac05b85e73ad91676063592b96.tar.bz2 |
rtos: hwthread: fix clang error core.NullDereference
Clang spots a potential NULL pointer dereferencing that is instead
an incorrect use of an array of pointers:
src/rtos/hwthread.c:254:32: warning: Dereference of null pointer
[core.NullDereference]
(*rtos_reg_list)[j].number = (*reg_list)[i].number;
^~~~~~~~~~~~~~~~~~~~~
The error has not been spotted before because:
- this function is not called for the first core of the SMP node,
- for the other cores on Cortex-A it still returns valid register
value for the first 12 ARM registers, then it diverges.
Also Valgrind does not spot any issue at runtime.
Address the array correctly.
While there, use DIV_ROUND_UP() macro for the computation.
Change-Id: Ib87e60e0edfd9671091f5dcfa9aedaf1aed800d1
Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com>
Reviewed-on: https://review.openocd.org/c/openocd/+/7337
Tested-by: jenkins
Reviewed-by: Tomas Vanek <vanekt@fbl.cz>
-rw-r--r-- | src/rtos/hwthread.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/src/rtos/hwthread.c b/src/rtos/hwthread.c index e5eaf42..50e7bae 100644 --- a/src/rtos/hwthread.c +++ b/src/rtos/hwthread.c @@ -255,10 +255,10 @@ static int hwthread_get_thread_reg_list(struct rtos *rtos, int64_t thread_id, for (int i = 0; i < reg_list_size; i++) { if (!reg_list[i] || reg_list[i]->exist == false || reg_list[i]->hidden) continue; - (*rtos_reg_list)[j].number = (*reg_list)[i].number; - (*rtos_reg_list)[j].size = (*reg_list)[i].size; - memcpy((*rtos_reg_list)[j].value, (*reg_list)[i].value, - ((*reg_list)[i].size + 7) / 8); + (*rtos_reg_list)[j].number = reg_list[i]->number; + (*rtos_reg_list)[j].size = reg_list[i]->size; + memcpy((*rtos_reg_list)[j].value, reg_list[i]->value, + DIV_ROUND_UP(reg_list[i]->size, 8)); j++; } free(reg_list); |