<div dir="ltr"><div>Ubsan is not happy after this patch</div><a href="https://lab.llvm.org/buildbot/#/builders/5/builds/26239/steps/19/logs/stdio">https://lab.llvm.org/buildbot/#/builders/5/builds/26239/steps/19/logs/stdio</a><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, 18 Jul 2022 at 20:39, Lang Hames via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
Author: Lang Hames<br>
Date: 2022-07-18T20:39:01-07:00<br>
New Revision: 67220c2ad72e32cea18bb261366e64fe5de75b16<br>
<br>
URL: <a href="https://github.com/llvm/llvm-project/commit/67220c2ad72e32cea18bb261366e64fe5de75b16" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/67220c2ad72e32cea18bb261366e64fe5de75b16</a><br>
DIFF: <a href="https://github.com/llvm/llvm-project/commit/67220c2ad72e32cea18bb261366e64fe5de75b16.diff" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/67220c2ad72e32cea18bb261366e64fe5de75b16.diff</a><br>
<br>
LOG: [ORC] Fix serialization / deserialization of default-constructed ArrayRef<char>.<br>
<br>
Avoids a zero-length memcpy from a null src, which caused errors on some of the<br>
sanitizer bots. Also uses null when deserializing an empty ArrayRef (rather<br>
than pointing to a zero length range in the middle of the input buffer).<br>
<br>
Added: <br>
<br>
<br>
Modified: <br>
    llvm/include/llvm/ExecutionEngine/Orc/Shared/SimplePackedSerialization.h<br>
    llvm/unittests/ExecutionEngine/Orc/SimplePackedSerializationTest.cpp<br>
<br>
Removed: <br>
<br>
<br>
<br>
################################################################################<br>
diff  --git a/llvm/include/llvm/ExecutionEngine/Orc/Shared/SimplePackedSerialization.h b/llvm/include/llvm/ExecutionEngine/Orc/Shared/SimplePackedSerialization.h<br>
index 9be58e9f0fa9d..794c07b4e4c0b 100644<br>
--- a/llvm/include/llvm/ExecutionEngine/Orc/Shared/SimplePackedSerialization.h<br>
+++ b/llvm/include/llvm/ExecutionEngine/Orc/Shared/SimplePackedSerialization.h<br>
@@ -56,6 +56,7 @@ class SPSOutputBuffer {<br>
   SPSOutputBuffer(char *Buffer, size_t Remaining)<br>
       : Buffer(Buffer), Remaining(Remaining) {}<br>
   bool write(const char *Data, size_t Size) {<br>
+    assert(Data && "Data must not be null");<br>
     if (Size > Remaining)<br>
       return false;<br>
     memcpy(Buffer, Data, Size);<br>
@@ -349,6 +350,8 @@ template <> class SPSSerializationTraits<SPSSequence<char>, ArrayRef<char>> {<br>
   static bool serialize(SPSOutputBuffer &OB, const ArrayRef<char> &A) {<br>
     if (!SPSArgList<uint64_t>::serialize(OB, static_cast<uint64_t>(A.size())))<br>
       return false;<br>
+    if (A.empty()) // Empty ArrayRef may have null data, so bail out early.<br>
+      return true;<br>
     return OB.write(A.data(), A.size());<br>
   }<br>
<br>
@@ -358,7 +361,7 @@ template <> class SPSSerializationTraits<SPSSequence<char>, ArrayRef<char>> {<br>
       return false;<br>
     if (Size > std::numeric_limits<size_t>::max())<br>
       return false;<br>
-    A = {IB.data(), static_cast<size_t>(Size)};<br>
+    A = {Size ? IB.data() : nullptr, static_cast<size_t>(Size)};<br>
     return IB.skip(Size);<br>
   }<br>
 };<br>
<br>
diff  --git a/llvm/unittests/ExecutionEngine/Orc/SimplePackedSerializationTest.cpp b/llvm/unittests/ExecutionEngine/Orc/SimplePackedSerializationTest.cpp<br>
index 56b6ad6c81df1..f5319e3287766 100644<br>
--- a/llvm/unittests/ExecutionEngine/Orc/SimplePackedSerializationTest.cpp<br>
+++ b/llvm/unittests/ExecutionEngine/Orc/SimplePackedSerializationTest.cpp<br>
@@ -187,3 +187,24 @@ TEST(SimplePackedSerializationTest, ArrayRef) {<br>
   // Input should reference buffer.<br>
   EXPECT_LT(HelloIn.data() - Buffer, BufferSize);<br>
 }<br>
+<br>
+TEST(SimplePackedSerializationTest, ArrayRefEmpty) {<br>
+  // Make sure that empty ArrayRefs serialize and deserialize as expected.<br>
+  // Empty ArrayRefs should not succeed even when the data field is null, and<br>
+  // should deserialize to a default-constructed ArrayRef, not a pointer into<br>
+  // the stream.<br>
+  constexpr unsigned BufferSize = sizeof(uint64_t);<br>
+  char Buffer[BufferSize];<br>
+  memset(Buffer, 0, BufferSize);<br>
+<br>
+  ArrayRef<char> AOut;<br>
+  SPSOutputBuffer OB(Buffer, BufferSize);<br>
+  EXPECT_TRUE(SPSArgList<SPSSequence<char>>::serialize(OB, AOut));<br>
+<br>
+  ArrayRef<char> AIn;<br>
+  SPSInputBuffer IB(Buffer, BufferSize);<br>
+  EXPECT_TRUE(SPSArgList<SPSSequence<char>>::deserialize(IB, AIn));<br>
+<br>
+  EXPECT_EQ(AIn.data(), nullptr);<br>
+  EXPECT_EQ(AIn.size(), 0U);<br>
+}<br>
<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>