[libc-commits] [libc] [libc] Independent strcat/strncat (PR #142643)
Michael Jones via libc-commits
libc-commits at lists.llvm.org
Wed Jun 4 16:22:28 PDT 2025
https://github.com/michaelrj-google updated https://github.com/llvm/llvm-project/pull/142643
>From 07a06481b161953932bdf8ea2df9ae15956182cc Mon Sep 17 00:00:00 2001
From: Michael Jones <michaelrj at google.com>
Date: Tue, 3 Jun 2025 10:19:52 -0700
Subject: [PATCH 1/2] [libc] Independent strcat/strncat
The previous implementations called other entrypoints. This patch fixes
strcat and strncat to be properly independent.
---
libc/src/string/CMakeLists.txt | 2 --
libc/src/string/strcat.cpp | 9 +++++----
libc/src/string/strncat.cpp | 9 +++++----
3 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/libc/src/string/CMakeLists.txt b/libc/src/string/CMakeLists.txt
index 2c607bf8ea895..0e9fc33418515 100644
--- a/libc/src/string/CMakeLists.txt
+++ b/libc/src/string/CMakeLists.txt
@@ -110,7 +110,6 @@ add_entrypoint_object(
HDRS
strcat.h
DEPENDS
- .strcpy
.string_utils
libc.include.llvm-libc-types.size_t
)
@@ -267,7 +266,6 @@ add_entrypoint_object(
HDRS
strncat.h
DEPENDS
- .strncpy
.string_utils
libc.include.llvm-libc-types.size_t
)
diff --git a/libc/src/string/strcat.cpp b/libc/src/string/strcat.cpp
index 0eb189ce204f0..4b6717c3c98e5 100644
--- a/libc/src/string/strcat.cpp
+++ b/libc/src/string/strcat.cpp
@@ -8,7 +8,6 @@
#include "src/string/strcat.h"
#include "src/__support/macros/config.h"
-#include "src/string/strcpy.h"
#include "src/string/string_utils.h"
#include "src/__support/common.h"
@@ -18,9 +17,11 @@ namespace LIBC_NAMESPACE_DECL {
LLVM_LIBC_FUNCTION(char *, strcat,
(char *__restrict dest, const char *__restrict src)) {
size_t dest_length = internal::string_length(dest);
- size_t src_length = internal::string_length(src);
- LIBC_NAMESPACE::strcpy(dest + dest_length, src);
- dest[dest_length + src_length] = '\0';
+ size_t i;
+ for (i = 0; src[i] != '\0'; ++i)
+ dest[dest_length + i] = src[i];
+
+ dest[dest_length + i] = '\0';
return dest;
}
diff --git a/libc/src/string/strncat.cpp b/libc/src/string/strncat.cpp
index 221881f93c47a..abd8d001f779c 100644
--- a/libc/src/string/strncat.cpp
+++ b/libc/src/string/strncat.cpp
@@ -18,11 +18,12 @@ namespace LIBC_NAMESPACE_DECL {
LLVM_LIBC_FUNCTION(char *, strncat,
(char *__restrict dest, const char *__restrict src,
size_t count)) {
- size_t src_length = internal::string_length(src);
- size_t copy_amount = src_length > count ? count : src_length;
size_t dest_length = internal::string_length(dest);
- LIBC_NAMESPACE::strncpy(dest + dest_length, src, copy_amount);
- dest[dest_length + copy_amount] = '\0';
+ size_t i;
+ for (i = 0; i < count && src[i] != '\0'; ++i)
+ dest[dest_length + i] = src[i];
+
+ dest[dest_length + i] = '\0';
return dest;
}
>From 7ca40634c5151eedc1b34185dcc651e4cb656ada Mon Sep 17 00:00:00 2001
From: Michael Jones <michaelrj at google.com>
Date: Wed, 4 Jun 2025 16:22:07 -0700
Subject: [PATCH 2/2] fix stpcpy as well
---
libc/src/string/CMakeLists.txt | 1 -
libc/src/string/stpcpy.cpp | 6 +++---
2 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/libc/src/string/CMakeLists.txt b/libc/src/string/CMakeLists.txt
index 0e9fc33418515..0975d8e4177d4 100644
--- a/libc/src/string/CMakeLists.txt
+++ b/libc/src/string/CMakeLists.txt
@@ -89,7 +89,6 @@ add_entrypoint_object(
HDRS
stpcpy.h
DEPENDS
- .mempcpy
.string_utils
)
diff --git a/libc/src/string/stpcpy.cpp b/libc/src/string/stpcpy.cpp
index 979edd72c1f1d..fefae81172585 100644
--- a/libc/src/string/stpcpy.cpp
+++ b/libc/src/string/stpcpy.cpp
@@ -8,7 +8,7 @@
#include "src/string/stpcpy.h"
#include "src/__support/macros/config.h"
-#include "src/string/mempcpy.h"
+#include "src/string/memory_utils/inline_memcpy.h"
#include "src/string/string_utils.h"
#include "src/__support/common.h"
@@ -18,8 +18,8 @@ namespace LIBC_NAMESPACE_DECL {
LLVM_LIBC_FUNCTION(char *, stpcpy,
(char *__restrict dest, const char *__restrict src)) {
size_t size = internal::string_length(src) + 1;
- char *result =
- reinterpret_cast<char *>(LIBC_NAMESPACE::mempcpy(dest, src, size));
+ inline_memcpy(dest, src, size);
+ char *result = dest + size;
if (result != nullptr)
return result - 1;
More information about the libc-commits
mailing list