<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>