Skip to content

Commit

Permalink
cortex_m: fix scan-build false positive
Browse files Browse the repository at this point in the history
Scan-build is unable to detect that 'target->dbg_msg_enabled' does
not change across the function cortex_m_fast_read_all_regs().
It incorrectly assumes that it can be false at the first check (so
'dcrdr' get not assigned) and it is true later on (when 'dcrdr'
get used).
This triggers a false positive:
	src/target/cortex_m.c:338:12: warning:
		3rd function call argument is an uninitialized value
		[core.CallAndMessage]
	retval = mem_ap_write_atomic_u32(armv7m->debug_ap, DCB_DCRDR, dcrdr);

Use a local variable for 'target->dbg_msg_enabled' so scan-build
can track it as not modified.
While there, change the type of 'target->dbg_msg_enabled' to
boolean as there is no reason to use uint32_t.

Change-Id: Icaf1a1b2dea8bc55108182ea440708ab76396cd7
Signed-off-by: Antonio Borneo <[email protected]>
Reviewed-on: https://review.openocd.org/c/openocd/+/8391
Tested-by: jenkins
Reviewed-by: Tomas Vanek <[email protected]>
  • Loading branch information
borneoa committed Jul 28, 2024
1 parent 052a4a6 commit 5b7b773
Show file tree
Hide file tree
Showing 4 changed files with 7 additions and 6 deletions.
5 changes: 3 additions & 2 deletions src/target/cortex_m.c
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,8 @@ static int cortex_m_fast_read_all_regs(struct target *target)

/* because the DCB_DCRDR is used for the emulated dcc channel
* we have to save/restore the DCB_DCRDR when used */
if (target->dbg_msg_enabled) {
bool dbg_msg_enabled = target->dbg_msg_enabled;
if (dbg_msg_enabled) {
retval = mem_ap_read_u32(armv7m->debug_ap, DCB_DCRDR, &dcrdr);
if (retval != ERROR_OK)
return retval;
Expand Down Expand Up @@ -332,7 +333,7 @@ static int cortex_m_fast_read_all_regs(struct target *target)
if (retval != ERROR_OK)
return retval;

if (target->dbg_msg_enabled) {
if (dbg_msg_enabled) {
/* restore DCB_DCRDR - this needs to be in a separate
* transaction otherwise the emulated DCC channel breaks */
retval = mem_ap_write_atomic_u32(armv7m->debug_ap, DCB_DCRDR, dcrdr);
Expand Down
2 changes: 1 addition & 1 deletion src/target/target.c
Original file line number Diff line number Diff line change
Expand Up @@ -5813,7 +5813,7 @@ static int target_create(struct jim_getopt_info *goi)
}

target->dbgmsg = NULL;
target->dbg_msg_enabled = 0;
target->dbg_msg_enabled = false;

target->endianness = TARGET_ENDIAN_UNKNOWN;

Expand Down
2 changes: 1 addition & 1 deletion src/target/target.h
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ struct target {
struct watchpoint *watchpoints; /* list of watchpoints */
struct trace *trace_info; /* generic trace information */
struct debug_msg_receiver *dbgmsg; /* list of debug message receivers */
uint32_t dbg_msg_enabled; /* debug message status */
bool dbg_msg_enabled; /* debug message status */
void *arch_info; /* architecture specific information */
void *private_config; /* pointer to target specific config data (for jim_configure hook) */
struct target *next; /* next target in list */
Expand Down
4 changes: 2 additions & 2 deletions src/target/target_request.c
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ static int add_debug_msg_receiver(struct command_context *cmd_ctx, struct target
(*p)->next = NULL;

/* enable callback */
target->dbg_msg_enabled = 1;
target->dbg_msg_enabled = true;

return ERROR_OK;
}
Expand Down Expand Up @@ -225,7 +225,7 @@ int delete_debug_msg_receiver(struct command_context *cmd_ctx, struct target *ta
free(c);
if (!*p) {
/* disable callback */
target->dbg_msg_enabled = 0;
target->dbg_msg_enabled = false;
}
return ERROR_OK;
} else
Expand Down

0 comments on commit 5b7b773

Please sign in to comment.