[Scudo] Improve ScopedString constructor
Avoid referencing elements beyond internal vector size.
Reviewed By: cryptoad
Differential Revision: https://reviews.llvm.org/D103718
GitOrigin-RevId: df87aeb8268240a1f9042aff1450d84900c52ae5
diff --git a/string_utils.h b/string_utils.h
index 7c1cd57..7d9c539 100644
--- a/string_utils.h
+++ b/string_utils.h
@@ -18,12 +18,12 @@
class ScopedString {
public:
- explicit ScopedString() : String() {}
+ explicit ScopedString() { String.push_back('\0'); }
uptr length() { return Length; }
const char *data() { return String.data(); }
void clear() {
- if (!String.empty())
- String[0] = '\0';
+ String.clear();
+ String.push_back('\0');
Length = 0;
}
void append(const char *Format, va_list Args);
diff --git a/tests/strings_test.cpp b/tests/strings_test.cpp
index 332bac2..298977a 100644
--- a/tests/strings_test.cpp
+++ b/tests/strings_test.cpp
@@ -12,6 +12,12 @@
#include <limits.h>
+TEST(ScudoStringsTest, Constructor) {
+ scudo::ScopedString Str;
+ EXPECT_EQ(0, Str.length());
+ EXPECT_EQ('\0', *Str.data());
+}
+
TEST(ScudoStringsTest, Basic) {
scudo::ScopedString Str;
Str.append("a%db%zdc%ue%zuf%xh%zxq%pe%sr", static_cast<int>(-1),
@@ -28,6 +34,23 @@
EXPECT_STREQ(expectedString.c_str(), Str.data());
}
+TEST(ScudoStringsTest, Clear) {
+ scudo::ScopedString Str;
+ Str.append("123");
+ Str.clear();
+ EXPECT_EQ(0, Str.length());
+ EXPECT_EQ('\0', *Str.data());
+}
+
+TEST(ScudoStringsTest, ClearLarge) {
+ scudo::ScopedString Str;
+ for (int i = 0; i < 10000; ++i)
+ Str.append("123");
+ Str.clear();
+ EXPECT_EQ(0, Str.length());
+ EXPECT_EQ('\0', *Str.data());
+}
+
TEST(ScudoStringsTest, Precision) {
scudo::ScopedString Str;
Str.append("%.*s", 3, "12345");