diff --git a/compiler-rt/lib/scudo/standalone/string_utils.cpp b/compiler-rt/lib/scudo/standalone/string_utils.cpp --- a/compiler-rt/lib/scudo/standalone/string_utils.cpp +++ b/compiler-rt/lib/scudo/standalone/string_utils.cpp @@ -78,10 +78,11 @@ static int appendSignedDecimal(char **Buffer, const char *BufferEnd, s64 Num, u8 MinNumberLength, bool PadWithZero) { const bool Negative = (Num < 0); - return appendNumber(Buffer, BufferEnd, - static_cast(Negative ? -Num : Num), 10, - MinNumberLength, PadWithZero, Negative, - /*Upper=*/false); + const u64 UnsignedNum = (Num == INT64_MIN) + ? static_cast(INT64_MAX) + 1 + : static_cast(Negative ? -Num : Num); + return appendNumber(Buffer, BufferEnd, UnsignedNum, 10, MinNumberLength, + PadWithZero, Negative, /*Upper=*/false); } // Use the fact that explicitly requesting 0 Width (%0s) results in UB and @@ -158,16 +159,18 @@ CHECK(!((Precision >= 0 || LeftJustified) && *Cur != 's')); switch (*Cur) { case 'd': { - DVal = HaveLL ? va_arg(Args, s64) - : HaveZ ? va_arg(Args, sptr) : va_arg(Args, int); + DVal = HaveLL ? va_arg(Args, s64) + : HaveZ ? va_arg(Args, sptr) + : va_arg(Args, int); Res += appendSignedDecimal(&Buffer, BufferEnd, DVal, Width, PadWithZero); break; } case 'u': case 'x': case 'X': { - UVal = HaveLL ? va_arg(Args, u64) - : HaveZ ? va_arg(Args, uptr) : va_arg(Args, unsigned); + UVal = HaveLL ? va_arg(Args, u64) + : HaveZ ? va_arg(Args, uptr) + : va_arg(Args, unsigned); const bool Upper = (*Cur == 'X'); Res += appendUnsigned(&Buffer, BufferEnd, UVal, (*Cur == 'u') ? 10 : 16, Width, PadWithZero, Upper); diff --git a/compiler-rt/lib/scudo/standalone/tests/combined_test.cpp b/compiler-rt/lib/scudo/standalone/tests/combined_test.cpp --- a/compiler-rt/lib/scudo/standalone/tests/combined_test.cpp +++ b/compiler-rt/lib/scudo/standalone/tests/combined_test.cpp @@ -82,11 +82,16 @@ using AllocatorT = TestAllocator; auto Allocator = std::unique_ptr(new AllocatorT()); - EXPECT_FALSE(Allocator->isOwned(&Mutex)); - EXPECT_FALSE(Allocator->isOwned(&Allocator)); - scudo::u64 StackVariable = 0x42424242U; - EXPECT_FALSE(Allocator->isOwned(&StackVariable)); - EXPECT_EQ(StackVariable, 0x42424242U); + static scudo::u8 StaticBuffer[scudo::Chunk::getHeaderSize() + 1]; + EXPECT_FALSE( + Allocator->isOwned(&StaticBuffer[scudo::Chunk::getHeaderSize()])); + + scudo::u8 StackBuffer[scudo::Chunk::getHeaderSize() + 1]; + for (scudo::uptr I = 0; I < sizeof(StackBuffer); I++) + StackBuffer[I] = 0x42U; + EXPECT_FALSE(Allocator->isOwned(&StackBuffer[scudo::Chunk::getHeaderSize()])); + for (scudo::uptr I = 0; I < sizeof(StackBuffer); I++) + EXPECT_EQ(StackBuffer[I], 0x42U); constexpr scudo::uptr MinAlignLog = FIRST_32_SECOND_64(3U, 4U);