diff mbox series

cmd/mem.c: fix undefined behavior in mem cmp

Message ID 20240927-cmd-mem-undefined-v1-1-56fa57d0927b@cherry.de
State Rejected
Delegated to: Tom Rini
Headers show
Series cmd/mem.c: fix undefined behavior in mem cmp | expand

Commit Message

Quentin Schulz Sept. 27, 2024, 4:37 p.m. UTC
From: Quentin Schulz <quentin.schulz@cherry.de>

My linter complains that "When using void pointers in calculations, the
behaviour is undefined".

GCC does say that "In GNU C, addition and subtraction operations are
supported on pointers to void"[1] but this hints at this only being
supported in the GNU flavor of C. And I assume U-Boot may want to be
compiled with clang/llvm?

Let's fix that warning by casting the void pointer to a u8 pointer since
the size variable unit is byte.

[1] https://gcc.gnu.org/onlinedocs/gcc/Pointer-Arith.html

Fixes: 0628ab8ec598 ("sandbox: Change memory commands to use map_physmem")
Signed-off-by: Quentin Schulz <quentin.schulz@cherry.de>
---
 cmd/mem.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)


---
base-commit: 56b47b8b6a09c777e74fe6c52512c832691169aa
change-id: 20240927-cmd-mem-undefined-a4368d58b5b6

Best regards,

Comments

Rasmus Villemoes Sept. 27, 2024, 6:56 p.m. UTC | #1
Quentin Schulz <foss+uboot@0leil.net> writes:

> From: Quentin Schulz <quentin.schulz@cherry.de>
>
> My linter complains that "When using void pointers in calculations, the
> behaviour is undefined".
>
> GCC does say that "In GNU C, addition and subtraction operations are
> supported on pointers to void"[1] but this hints at this only being
> supported in the GNU flavor of C. And I assume U-Boot may want to be
> compiled with clang/llvm?
>
> Let's fix that warning by casting the void pointer to a u8 pointer since
> the size variable unit is byte.
>
> [1] https://gcc.gnu.org/onlinedocs/gcc/Pointer-Arith.html
>

No, let's please not. Try enabling -Wpointer-arith and see how much
churn that would require all over the tree (doing it in this one place
would be pointless), and all the casts would make the code much much
harder to read.

We do rely on lots of gcc extensions, and Clang has documented that it
"aims to support a broad range of GCC extensions". Arithmetic on void is
one of them, and that's not going to go away.

Rasmus
diff mbox series

Patch

diff --git a/cmd/mem.c b/cmd/mem.c
index 274348068c2..08ec0aefa7d 100644
--- a/cmd/mem.c
+++ b/cmd/mem.c
@@ -293,8 +293,8 @@  static int do_mem_cmp(struct cmd_tbl *cmdtp, int flag, int argc,
 			break;
 		}
 
-		buf1 += size;
-		buf2 += size;
+		buf1 = ((u8 *)buf1) + size;
+		buf2 = ((u8 *)buf2) + size;
 
 		/* reset watchdog from time to time */
 		if ((ngood % (64 << 10)) == 0)