diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common.h b/compiler-rt/lib/sanitizer_common/sanitizer_common.h index 26393d65c8e9..6b327a4aa16f 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_common.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_common.h @@ -643,6 +643,7 @@ class InternalScopedString { buffer_.resize(1); buffer_[0] = '\0'; } + void Append(const char *str); void AppendF(const char *format, ...) FORMAT(2, 3); const char *data() const { return buffer_.data(); } char *data() { return buffer_.data(); } diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_printf.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_printf.cpp index 33a226358f62..3d9d66c3f976 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_printf.cpp +++ b/compiler-rt/lib/sanitizer_common/sanitizer_printf.cpp @@ -337,6 +337,15 @@ int internal_snprintf(char *buffer, uptr length, const char *format, ...) { return needed_length; } +void InternalScopedString::Append(const char *str) { + if (!str) // For consistency with AppendF("%s", str) which accepts nullptr. + return; + uptr prev_len = length(); + uptr str_len = internal_strlen(str); + buffer_.resize(prev_len + str_len + 1); + internal_memcpy(buffer_.data() + prev_len, str, str_len + 1); +} + void InternalScopedString::AppendF(const char *format, ...) { uptr prev_len = length(); diff --git a/compiler-rt/lib/sanitizer_common/tests/sanitizer_common_test.cpp b/compiler-rt/lib/sanitizer_common/tests/sanitizer_common_test.cpp index 6acfdd437196..fc12c07bb914 100644 --- a/compiler-rt/lib/sanitizer_common/tests/sanitizer_common_test.cpp +++ b/compiler-rt/lib/sanitizer_common/tests/sanitizer_common_test.cpp @@ -376,7 +376,33 @@ TEST(SanitizerCommon, RemoveANSIEscapeSequencesFromString) { } } -TEST(SanitizerCommon, InternalScopedString) { +TEST(SanitizerCommon, InternalScopedStringAppend) { + InternalScopedString str; + EXPECT_EQ(0U, str.length()); + EXPECT_STREQ("", str.data()); + + str.Append(nullptr); + EXPECT_EQ(0U, str.length()); + EXPECT_STREQ("", str.data()); + + str.Append(""); + EXPECT_EQ(0U, str.length()); + EXPECT_STREQ("", str.data()); + + str.Append("foo"); + EXPECT_EQ(3U, str.length()); + EXPECT_STREQ("foo", str.data()); + + str.Append(""); + EXPECT_EQ(3U, str.length()); + EXPECT_STREQ("foo", str.data()); + + str.Append("123\000456"); + EXPECT_EQ(6U, str.length()); + EXPECT_STREQ("foo123", str.data()); +} + +TEST(SanitizerCommon, InternalScopedStringAppendF) { InternalScopedString str; EXPECT_EQ(0U, str.length()); EXPECT_STREQ("", str.data());