[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");