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