forked from OSchip/llvm-project
[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:
parent
713c30b389
commit
f018246c20
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue