Revert "[UBSan] Improve error message when a misalignment is due to t… (#166197)
…arget de…" This reverts commit 47c54d55c9fac5ea7c87881e00f96e8c12b18174.
This commit is contained in:
parent
a85ecfa7a8
commit
6a275de13f
@ -18,9 +18,6 @@
|
||||
#include "ConstantEmitter.h"
|
||||
#include "TargetInfo.h"
|
||||
#include "clang/Basic/CodeGenOptions.h"
|
||||
#include "clang/Basic/Sanitizers.h"
|
||||
#include "clang/Basic/SourceLocation.h"
|
||||
#include "clang/Basic/SourceManager.h"
|
||||
#include "clang/CodeGen/CGFunctionInfo.h"
|
||||
#include "llvm/IR/Intrinsics.h"
|
||||
|
||||
@ -1752,17 +1749,6 @@ llvm::Value *CodeGenFunction::EmitCXXNewExpr(const CXXNewExpr *E) {
|
||||
allocator->isReservedGlobalPlacementOperator())
|
||||
result = Builder.CreateLaunderInvariantGroup(result);
|
||||
|
||||
// Check the default alignment of the type and why. Users may incorrectly
|
||||
// return misaligned memory from a replaced operator new without knowing
|
||||
// about default alignment.
|
||||
TypeCheckKind checkKind = CodeGenFunction::TCK_ConstructorCall;
|
||||
const TargetInfo &TI = getContext().getTargetInfo();
|
||||
unsigned DefaultTargetAlignment = TI.getNewAlign() / TI.getCharWidth();
|
||||
if (SanOpts.has(SanitizerKind::Alignment) &&
|
||||
(DefaultTargetAlignment >
|
||||
CGM.getContext().getTypeAlignInChars(allocType).getQuantity()))
|
||||
checkKind = CodeGenFunction::TCK_ConstructorCallMinimumAlign;
|
||||
|
||||
// Emit sanitizer checks for pointer value now, so that in the case of an
|
||||
// array it was checked only once and not at each constructor call. We may
|
||||
// have already checked that the pointer is non-null.
|
||||
@ -1770,9 +1756,10 @@ llvm::Value *CodeGenFunction::EmitCXXNewExpr(const CXXNewExpr *E) {
|
||||
// we'll null check the wrong pointer here.
|
||||
SanitizerSet SkippedChecks;
|
||||
SkippedChecks.set(SanitizerKind::Null, nullCheck);
|
||||
EmitTypeCheck(
|
||||
checkKind, E->getAllocatedTypeSourceInfo()->getTypeLoc().getBeginLoc(),
|
||||
result, allocType, result.getAlignment(), SkippedChecks, numElements);
|
||||
EmitTypeCheck(CodeGenFunction::TCK_ConstructorCall,
|
||||
E->getAllocatedTypeSourceInfo()->getTypeLoc().getBeginLoc(),
|
||||
result, allocType, result.getAlignment(), SkippedChecks,
|
||||
numElements);
|
||||
|
||||
EmitNewInitializer(*this, E, allocType, elementTy, result, numElements,
|
||||
allocSizeWithoutCookie);
|
||||
|
||||
@ -3296,10 +3296,7 @@ public:
|
||||
TCK_NonnullAssign,
|
||||
/// Checking the operand of a dynamic_cast or a typeid expression. Must be
|
||||
/// null or an object within its lifetime.
|
||||
TCK_DynamicOperation,
|
||||
/// Checking the 'this' poiner for a constructor call, including that the
|
||||
/// alignment is greater or equal to the targets minimum alignment
|
||||
TCK_ConstructorCallMinimumAlign
|
||||
TCK_DynamicOperation
|
||||
};
|
||||
|
||||
/// Determine whether the pointer type check \p TCK permits null pointers.
|
||||
|
||||
@ -28,7 +28,6 @@ UBSAN_CHECK(NullptrAfterNonZeroOffset, "nullptr-after-nonzero-offset",
|
||||
UBSAN_CHECK(PointerOverflow, "pointer-overflow", "pointer-overflow")
|
||||
UBSAN_CHECK(MisalignedPointerUse, "misaligned-pointer-use", "alignment")
|
||||
UBSAN_CHECK(AlignmentAssumption, "alignment-assumption", "alignment")
|
||||
UBSAN_CHECK(MinumumAssumedAlignment, "minimum-assumed-alignment", "alignment")
|
||||
UBSAN_CHECK(InsufficientObjectSize, "insufficient-object-size", "object-size")
|
||||
UBSAN_CHECK(SignedIntegerOverflow, "signed-integer-overflow",
|
||||
"signed-integer-overflow")
|
||||
|
||||
@ -73,26 +73,14 @@ enum TypeCheckKind {
|
||||
TCK_NonnullAssign,
|
||||
/// Checking the operand of a dynamic_cast or a typeid expression. Must be
|
||||
/// null or an object within its lifetime.
|
||||
TCK_DynamicOperation,
|
||||
/// Checking the 'this' poiner for a constructor call, including that the
|
||||
/// alignment is greater or equal to the targets minimum alignment
|
||||
TCK_ConstructorCallMinimumAlign
|
||||
TCK_DynamicOperation
|
||||
};
|
||||
|
||||
extern const char *const TypeCheckKinds[] = {
|
||||
"load of",
|
||||
"store to",
|
||||
"reference binding to",
|
||||
"member access within",
|
||||
"member call on",
|
||||
"constructor call on",
|
||||
"downcast of",
|
||||
"downcast of",
|
||||
"upcast of",
|
||||
"cast to virtual base of",
|
||||
"_Nonnull binding to",
|
||||
"dynamic operation on",
|
||||
"constructor call with pointer from operator new on"};
|
||||
"load of", "store to", "reference binding to", "member access within",
|
||||
"member call on", "constructor call on", "downcast of", "downcast of",
|
||||
"upcast of", "cast to virtual base of", "_Nonnull binding to",
|
||||
"dynamic operation on"};
|
||||
}
|
||||
|
||||
static void handleTypeMismatchImpl(TypeMismatchData *Data, ValueHandle Pointer,
|
||||
@ -106,9 +94,7 @@ static void handleTypeMismatchImpl(TypeMismatchData *Data, ValueHandle Pointer,
|
||||
? ErrorType::NullPointerUseWithNullability
|
||||
: ErrorType::NullPointerUse;
|
||||
else if (Pointer & (Alignment - 1))
|
||||
ET = (Data->TypeCheckKind == TCK_ConstructorCallMinimumAlign)
|
||||
? ErrorType::MinumumAssumedAlignment
|
||||
: ErrorType::MisalignedPointerUse;
|
||||
ET = ErrorType::MisalignedPointerUse;
|
||||
else
|
||||
ET = ErrorType::InsufficientObjectSize;
|
||||
|
||||
@ -131,13 +117,6 @@ static void handleTypeMismatchImpl(TypeMismatchData *Data, ValueHandle Pointer,
|
||||
Diag(Loc, DL_Error, ET, "%0 null pointer of type %1")
|
||||
<< TypeCheckKinds[Data->TypeCheckKind] << Data->Type;
|
||||
break;
|
||||
case ErrorType::MinumumAssumedAlignment:
|
||||
Diag(Loc, DL_Error, ET,
|
||||
"%0 misaligned address %1 for type %2, "
|
||||
"which requires target minimum assumed %3 byte alignment")
|
||||
<< TypeCheckKinds[Data->TypeCheckKind] << (void *)Pointer << Data->Type
|
||||
<< Alignment;
|
||||
break;
|
||||
case ErrorType::MisalignedPointerUse:
|
||||
Diag(Loc, DL_Error, ET, "%0 misaligned address %1 for type %3, "
|
||||
"which requires %2 byte alignment")
|
||||
|
||||
@ -1,36 +0,0 @@
|
||||
// RUN: %clangxx %gmlt -fsanitize=alignment %s -o %t
|
||||
// RUN: %run %t 2>&1 | FileCheck %s
|
||||
|
||||
// UNSUPPORTED: i386
|
||||
// UNSUPPORTED: armv7l
|
||||
|
||||
// These sanitizers already overload the new operator so won't compile this test
|
||||
// UNSUPPORTED: ubsan-msan
|
||||
// UNSUPPORTED: ubsan-tsan
|
||||
|
||||
#include <cassert>
|
||||
#include <cstdlib>
|
||||
|
||||
void *operator new(std::size_t count) {
|
||||
constexpr const size_t offset = 8;
|
||||
|
||||
// allocate a bit more so we can safely offset it
|
||||
void *ptr = std::malloc(count + offset);
|
||||
|
||||
// verify malloc returned 16 bytes aligned mem
|
||||
static_assert(__STDCPP_DEFAULT_NEW_ALIGNMENT__ == 16);
|
||||
assert(((std::ptrdiff_t)ptr & (__STDCPP_DEFAULT_NEW_ALIGNMENT__ - 1)) == 0);
|
||||
|
||||
return (char *)ptr + offset;
|
||||
}
|
||||
|
||||
struct Foo {
|
||||
void *_cookie1, *_cookie2;
|
||||
};
|
||||
|
||||
static_assert(alignof(Foo) == 8);
|
||||
int main() {
|
||||
// CHECK: runtime error: constructor call with pointer from operator new on misaligned address 0x{{.*}} for type 'Foo', which requires target minimum assumed 16 byte alignment
|
||||
Foo *f = new Foo;
|
||||
return 0;
|
||||
}
|
||||
@ -101,7 +101,7 @@ int main(int, char **argv) {
|
||||
return s->f() && 0;
|
||||
|
||||
case 'n':
|
||||
// CHECK-NEW: misaligned.cpp:[[@LINE+4]]{{(:21)?}}: runtime error: constructor call with pointer from operator new on misaligned address [[PTR:0x[0-9a-f]*]] for type 'S', which requires target minimum assumed 4 byte alignment
|
||||
// CHECK-NEW: misaligned.cpp:[[@LINE+4]]{{(:21)?}}: runtime error: constructor call on misaligned address [[PTR:0x[0-9a-f]*]] for type 'S', which requires 4 byte alignment
|
||||
// CHECK-NEW-NEXT: [[PTR]]: note: pointer points here
|
||||
// CHECK-NEW-NEXT: {{^ 00 00 00 01 02 03 04 05}}
|
||||
// CHECK-NEW-NEXT: {{^ \^}}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user