[scudo][standalone] Enabled SCUDO_DEBUG for tests + fixes

Summary:
`SCUDO_DEBUG` was not enabled for unit tests, meaning the `DCHECK`s
were never tripped. While turning this on, I discovered that a few
of those not-exercised checks were actually wrong. This CL addresses
those incorrect checks.

Not that to work in tests `CHECK_IMPL` has to explicitely use the
`scudo` namespace. Also changes a C cast to a C++ cast.

Reviewers: hctim, pcc, cferris, eugenis, vitalybuka

Subscribers: mgorny, #sanitizers, llvm-commits

Tags: #sanitizers, #llvm

Differential Revision: https://reviews.llvm.org/D70276
This commit is contained in:
Kostya Kortchinsky 2019-11-14 14:33:23 -08:00
parent 713c30b389
commit f018246c20
6 changed files with 13 additions and 10 deletions

View File

@ -222,7 +222,7 @@ public:
if (UNLIKELY(!isAligned(UserPtr, Alignment))) {
const uptr AlignedUserPtr = roundUpTo(UserPtr, Alignment);
const uptr Offset = AlignedUserPtr - UserPtr;
DCHECK_GT(Offset, 2 * sizeof(u32));
DCHECK_GE(Offset, 2 * sizeof(u32));
// The BlockMarker has no security purpose, but is specifically meant for
// the chunk iteration function that can be used in debugging situations.
// It is the only situation where we have to locate the start of a chunk

View File

@ -84,12 +84,12 @@ void NORETURN reportCheckFailed(const char *File, int Line,
#define CHECK_IMPL(C1, Op, C2) \
do { \
u64 V1 = (u64)(C1); \
u64 V2 = (u64)(C2); \
scudo::u64 V1 = (scudo::u64)(C1); \
scudo::u64 V2 = (scudo::u64)(C2); \
if (UNLIKELY(!(V1 Op V2))) { \
reportCheckFailed(__FILE__, __LINE__, "(" #C1 ") " #Op " (" #C2 ")", V1, \
V2); \
die(); \
scudo::reportCheckFailed(__FILE__, __LINE__, \
"(" #C1 ") " #Op " (" #C2 ")", V1, V2); \
scudo::die(); \
} \
} while (false)

View File

@ -114,7 +114,7 @@ template <uptr MaxFreeListSize>
void *MapAllocator<MaxFreeListSize>::allocate(uptr Size, uptr AlignmentHint,
uptr *BlockEnd,
bool ZeroContents) {
DCHECK_GT(Size, AlignmentHint);
DCHECK_GE(Size, AlignmentHint);
const uptr PageSize = getPageSizeCached();
const uptr RoundedSize =
roundUpTo(Size + LargeBlock::getHeaderSize(), PageSize);

View File

@ -120,7 +120,8 @@ public:
if (C < LargestClassId)
CHECK_EQ(getClassIdBySize(S + 1), C + 1);
CHECK_EQ(getClassIdBySize(S - 1), C);
CHECK_GT(getSizeByClassId(C), getSizeByClassId(C - 1));
if (C - 1 != BatchClassId)
CHECK_GT(getSizeByClassId(C), getSizeByClassId(C - 1));
}
// Do not perform the loop if the maximum size is too large.
if (MaxSizeLog > 19)
@ -129,7 +130,7 @@ public:
const uptr C = getClassIdBySize(S);
CHECK_LT(C, NumClasses);
CHECK_GE(getSizeByClassId(C), S);
if (C > 0)
if (C - 1 != BatchClassId)
CHECK_LT(getSizeByClassId(C - 1), S);
}
}

View File

@ -11,6 +11,7 @@ set(SCUDO_UNITTEST_CFLAGS
-I${COMPILER_RT_SOURCE_DIR}/lib
-I${COMPILER_RT_SOURCE_DIR}/lib/scudo/standalone
-DGTEST_HAS_RTTI=0
-DSCUDO_DEBUG=1
# Extra flags for the C++ tests
# TODO(kostyak): find a way to make -fsized-deallocation work
-Wno-mismatched-new-delete)

View File

@ -84,7 +84,8 @@ private:
DCHECK_LE(Size, NewCapacity);
const uptr NewCapacityBytes =
roundUpTo(NewCapacity * sizeof(T), getPageSizeCached());
T *NewData = (T *)map(nullptr, NewCapacityBytes, "scudo:vector");
T *NewData =
reinterpret_cast<T *>(map(nullptr, NewCapacityBytes, "scudo:vector"));
if (Data) {
memcpy(NewData, Data, Size * sizeof(T));
unmap(Data, CapacityBytes);