This is an automated email from Gerrit. "Antonio Borneo <borneo.anto...@gmail.com>" just uploaded a new patch set to Gerrit, which you can find at https://review.openocd.org/c/openocd/+/7608
-- gerrit commit a8bcf7197d90e9d6be02be0bcd7014662d590d71 Author: Antonio Borneo <borneo.anto...@gmail.com> Date: Sat Apr 15 00:25:54 2023 +0200 target/espressif: fix clang report on list use It looks like a false positive. Scan-build considers as possible to: - have list_empty() return false; - list_for_each_safe() to not execute any loop, thus not assigning a non-NULL value to 'block'; - the NULL pointer 'block' is passed to list_del(). This is not possible because with list_empty(), the loop runs at least once. Rewrite the function to simplify the code and making it easier for scan-build to check it. This also drops an incorrect use of list_for_each_safe(), where the 'safe' version was not required. Change-Id: Ia8b1d221cf9df73db1196e3f51986023dcaf78eb Signed-off-by: Antonio Borneo <borneo.anto...@gmail.com> Fixes: 8d1dcf293a0c ("target/espressif: add application tracing functionality over JTAG") diff --git a/src/target/espressif/esp32_apptrace.c b/src/target/espressif/esp32_apptrace.c index dfeb794018..291503e530 100644 --- a/src/target/espressif/esp32_apptrace.c +++ b/src/target/espressif/esp32_apptrace.c @@ -356,18 +356,14 @@ static int esp32_apptrace_ready_block_put(struct esp32_apptrace_cmd_ctx *ctx, st static struct esp32_apptrace_block *esp32_apptrace_ready_block_get(struct esp32_apptrace_cmd_ctx *ctx) { - struct esp32_apptrace_block *block = NULL; + if (list_empty(&ctx->ready_trace_blocks)) + return NULL; - if (!list_empty(&ctx->ready_trace_blocks)) { - struct list_head *head = &ctx->ready_trace_blocks; - struct list_head *tmp, *pos; + struct esp32_apptrace_block *block = + list_last_entry(&ctx->ready_trace_blocks, struct esp32_apptrace_block, node); - list_for_each_safe(pos, tmp, head) { - block = list_entry(pos, struct esp32_apptrace_block, node); - } - /* remove it from ready list */ - list_del(&block->node); - } + /* remove it from ready list */ + list_del(&block->node); return block; } --