[PATCH] newlib: riscv: Remove undefined behavior in strlen()
Eric Salem
ericsalem@gmail.com
Fri May 30 03:00:52 GMT 2025
Pointer arithmetic overflow is undefined behavior, so use a signed type
to avoid it.
Signed-off-by: Eric Salem <ericsalem@gmail.com>
---
While strlen() has worked this way since the beginning, it's better to
not depend on compilers not changing the behavior when optimizing. Clang
will take advantage of this:
https://releases.llvm.org/20.1.0/tools/clang/docs/ReleaseNotes.html#potentially-breaking-changes
newlib/libc/machine/riscv/strlen.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/newlib/libc/machine/riscv/strlen.c b/newlib/libc/machine/riscv/strlen.c
index 9f1be1b0e70e..8ab5ce53737a 100644
--- a/newlib/libc/machine/riscv/strlen.c
+++ b/newlib/libc/machine/riscv/strlen.c
@@ -9,6 +9,7 @@
http://www.opensource.org/licenses.
*/
+#include <sys/types.h>
#include <string.h>
#include <stdint.h>
#include "rv_string.h"
@@ -38,7 +39,9 @@ size_t strlen(const char *str)
asm volatile ("" : "+r"(ps)); /* prevent "optimization" */
str = (const char *)ps;
- size_t ret = str - start, sp = sizeof (*ps);
+
+ size_t ret = str - start;
+ ssize_t sp = sizeof (*ps);
#if __riscv_zbb
psval = ~__LIBC_RISCV_ZBB_ORC_B(psval);
--
2.49.0
More information about the Newlib
mailing list