pw_string: Fix undefined behavior

- Passing nullptr to memcpy or memset is undefined behavior, even if the
  count is zero. Switch to std::fill_n and std::copy_n instead.
- Add a test to cover appending a character to an empty buffer.

Fixed: 539
Change-Id: If942335bfb59bac8fd72d105820886a2a88bd914
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/68584
Reviewed-by: Ted Pudlik <tpudlik@google.com>
Commit-Queue: Auto-Submit <auto-submit@pigweed.google.com.iam.gserviceaccount.com>
Pigweed-Auto-Submit: Wyatt Hepler <hepler@google.com>
diff --git a/pw_string/string_builder_test.cc b/pw_string/string_builder_test.cc
index 0b092ad..a1686ac 100644
--- a/pw_string/string_builder_test.cc
+++ b/pw_string/string_builder_test.cc
@@ -203,6 +203,12 @@
   EXPECT_STREQ("???????", sb.data());
 }
 
+TEST(StringBuilder, Append_Chars_ToEmpty) {
+  StringBuilder sb(std::span<char>{});
+
+  EXPECT_EQ(Status::ResourceExhausted(), sb.append(1, '?').last_status());
+}
+
 TEST(StringBuilder, Append_PartialCString) {
   StringBuffer<12> sb;
   EXPECT_TRUE(sb.append("123456", 4).ok());