Fix UBSan issues in QUICHE

It is UB to pass `nullptr` to `memcpy` and friends, even when the byte count is zero. This is a language bug in C that got carried over to C++. UBSan flags these as issues, which is one of the blockers for running Chromium through UBSan.

`std::copy` and friends from `<algorithm>` do not have this issue, so use those instead.

PiperOrigin-RevId: 576257137
diff --git a/quiche/common/quiche_data_writer.cc b/quiche/common/quiche_data_writer.cc
index 5e79439..98b5c37 100644
--- a/quiche/common/quiche_data_writer.cc
+++ b/quiche/common/quiche_data_writer.cc
@@ -99,7 +99,8 @@
     return false;
   }
 
-  memcpy(dest, data, data_len);
+  std::copy(static_cast<const char*>(data),
+            static_cast<const char*>(data) + data_len, dest);
 
   length_ += data_len;
   return true;
@@ -111,7 +112,7 @@
     return false;
   }
 
-  memset(dest, byte, count);
+  std::fill(dest, dest + count, byte);
 
   length_ += count;
   return true;
@@ -122,7 +123,7 @@
   if (length_ > capacity_) {
     return;
   }
-  memset(buffer_ + length_, 0x00, capacity_ - length_);
+  std::fill(buffer_ + length_, buffer_ + capacity_, 0x00);
   length_ = capacity_;
 }
 
diff --git a/quiche/quic/core/quic_packets.cc b/quiche/quic/core/quic_packets.cc
index 2262877..907c7c8 100644
--- a/quiche/quic/core/quic_packets.cc
+++ b/quiche/quic/core/quic_packets.cc
@@ -4,6 +4,7 @@
 
 #include "quiche/quic/core/quic_packets.h"
 
+#include <algorithm>
 #include <utility>
 
 #include "absl/strings/escaping.h"
@@ -311,7 +312,7 @@
 
 std::unique_ptr<QuicEncryptedPacket> QuicEncryptedPacket::Clone() const {
   char* buffer = new char[this->length()];
-  memcpy(buffer, this->data(), this->length());
+  std::copy(this->data(), this->data() + this->length(), buffer);
   return std::make_unique<QuicEncryptedPacket>(buffer, this->length(), true);
 }