forked from OSchip/llvm-project
[UBSan] Split -fsanitize=shift into -fsanitize=shift-base and -fsanitize=shift-exponent.
This is a recommit of r231150, reverted in r231409. Turns out that -fsanitize=shift-base check implementation only works if the shift exponent is valid, otherwise it contains undefined behavior itself. Make sure we check that exponent is valid before we proceed to check the base. Make sure that we actually report invalid values of base or exponent if -fsanitize=shift-base or -fsanitize=shift-exponent is specified, respectively. llvm-svn: 231711
This commit is contained in:
parent
2efa2d01d7
commit
21d2dda3d2
|
@ -998,7 +998,9 @@ are listed below.
|
|||
greater or equal to the promoted bit-width of the left hand side
|
||||
or less than zero, or where the left hand side is negative. For a
|
||||
signed left shift, also checks for signed overflow in C, and for
|
||||
unsigned overflow in C++.
|
||||
unsigned overflow in C++. You can use ``-fsanitize=shift-base`` or
|
||||
``-fsanitize=shift-exponent`` to check only left-hand side or
|
||||
right-hand side of shift operation, respectively.
|
||||
- ``-fsanitize=signed-integer-overflow``: Signed integer overflow,
|
||||
including all the checks added by ``-ftrapv``, and checking for
|
||||
overflow in signed division (``INT_MIN / -1``).
|
||||
|
|
|
@ -64,7 +64,9 @@ SANITIZER("null", Null)
|
|||
SANITIZER("object-size", ObjectSize)
|
||||
SANITIZER("return", Return)
|
||||
SANITIZER("returns-nonnull-attribute", ReturnsNonnullAttribute)
|
||||
SANITIZER("shift", Shift)
|
||||
SANITIZER("shift-base", ShiftBase)
|
||||
SANITIZER("shift-exponent", ShiftExponent)
|
||||
SANITIZER_GROUP("shift", Shift, ShiftBase | ShiftExponent)
|
||||
SANITIZER("signed-integer-overflow", SignedIntegerOverflow)
|
||||
SANITIZER("unreachable", Unreachable)
|
||||
SANITIZER("vla-bound", VLABound)
|
||||
|
|
|
@ -2664,21 +2664,34 @@ Value *ScalarExprEmitter::EmitShl(const BinOpInfo &Ops) {
|
|||
if (Ops.LHS->getType() != RHS->getType())
|
||||
RHS = Builder.CreateIntCast(RHS, Ops.LHS->getType(), false, "sh_prom");
|
||||
|
||||
if (CGF.SanOpts.has(SanitizerKind::Shift) && !CGF.getLangOpts().OpenCL &&
|
||||
isa<llvm::IntegerType>(Ops.LHS->getType())) {
|
||||
bool SanitizeBase = CGF.SanOpts.has(SanitizerKind::ShiftBase) &&
|
||||
Ops.Ty->hasSignedIntegerRepresentation();
|
||||
bool SanitizeExponent = CGF.SanOpts.has(SanitizerKind::ShiftExponent);
|
||||
// OpenCL 6.3j: shift values are effectively % word size of LHS.
|
||||
if (CGF.getLangOpts().OpenCL)
|
||||
RHS =
|
||||
Builder.CreateAnd(RHS, GetWidthMinusOneValue(Ops.LHS, RHS), "shl.mask");
|
||||
else if ((SanitizeBase || SanitizeExponent) &&
|
||||
isa<llvm::IntegerType>(Ops.LHS->getType())) {
|
||||
CodeGenFunction::SanitizerScope SanScope(&CGF);
|
||||
SmallVector<std::pair<Value *, SanitizerKind>, 2> Checks;
|
||||
llvm::Value *WidthMinusOne = GetWidthMinusOneValue(Ops.LHS, RHS);
|
||||
llvm::Value *Valid = Builder.CreateICmpULE(RHS, WidthMinusOne);
|
||||
llvm::Value *ValidExponent = Builder.CreateICmpULE(RHS, WidthMinusOne);
|
||||
|
||||
if (Ops.Ty->hasSignedIntegerRepresentation()) {
|
||||
if (SanitizeExponent) {
|
||||
Checks.push_back(
|
||||
std::make_pair(ValidExponent, SanitizerKind::ShiftExponent));
|
||||
}
|
||||
|
||||
if (SanitizeBase) {
|
||||
// Check whether we are shifting any non-zero bits off the top of the
|
||||
// integer. We only emit this check if exponent is valid - otherwise
|
||||
// instructions below will have undefined behavior themselves.
|
||||
llvm::BasicBlock *Orig = Builder.GetInsertBlock();
|
||||
llvm::BasicBlock *Cont = CGF.createBasicBlock("cont");
|
||||
llvm::BasicBlock *CheckBitsShifted = CGF.createBasicBlock("check");
|
||||
Builder.CreateCondBr(Valid, CheckBitsShifted, Cont);
|
||||
|
||||
// Check whether we are shifting any non-zero bits off the top of the
|
||||
// integer.
|
||||
CGF.EmitBlock(CheckBitsShifted);
|
||||
llvm::BasicBlock *CheckShiftBase = CGF.createBasicBlock("check");
|
||||
Builder.CreateCondBr(ValidExponent, CheckShiftBase, Cont);
|
||||
CGF.EmitBlock(CheckShiftBase);
|
||||
llvm::Value *BitsShiftedOff =
|
||||
Builder.CreateLShr(Ops.LHS,
|
||||
Builder.CreateSub(WidthMinusOne, RHS, "shl.zeros",
|
||||
|
@ -2693,19 +2706,17 @@ Value *ScalarExprEmitter::EmitShl(const BinOpInfo &Ops) {
|
|||
BitsShiftedOff = Builder.CreateLShr(BitsShiftedOff, One);
|
||||
}
|
||||
llvm::Value *Zero = llvm::ConstantInt::get(BitsShiftedOff->getType(), 0);
|
||||
llvm::Value *SecondCheck = Builder.CreateICmpEQ(BitsShiftedOff, Zero);
|
||||
llvm::Value *ValidBase = Builder.CreateICmpEQ(BitsShiftedOff, Zero);
|
||||
CGF.EmitBlock(Cont);
|
||||
llvm::PHINode *P = Builder.CreatePHI(Valid->getType(), 2);
|
||||
P->addIncoming(Valid, Orig);
|
||||
P->addIncoming(SecondCheck, CheckBitsShifted);
|
||||
Valid = P;
|
||||
llvm::PHINode *BaseCheck = Builder.CreatePHI(ValidBase->getType(), 2);
|
||||
BaseCheck->addIncoming(Builder.getTrue(), Orig);
|
||||
BaseCheck->addIncoming(ValidBase, CheckShiftBase);
|
||||
Checks.push_back(std::make_pair(BaseCheck, SanitizerKind::ShiftBase));
|
||||
}
|
||||
|
||||
EmitBinOpCheck(std::make_pair(Valid, SanitizerKind::Shift), Ops);
|
||||
assert(!Checks.empty());
|
||||
EmitBinOpCheck(Checks, Ops);
|
||||
}
|
||||
// OpenCL 6.3j: shift values are effectively % word size of LHS.
|
||||
if (CGF.getLangOpts().OpenCL)
|
||||
RHS = Builder.CreateAnd(RHS, GetWidthMinusOneValue(Ops.LHS, RHS), "shl.mask");
|
||||
|
||||
return Builder.CreateShl(Ops.LHS, RHS, "shl");
|
||||
}
|
||||
|
@ -2717,18 +2728,18 @@ Value *ScalarExprEmitter::EmitShr(const BinOpInfo &Ops) {
|
|||
if (Ops.LHS->getType() != RHS->getType())
|
||||
RHS = Builder.CreateIntCast(RHS, Ops.LHS->getType(), false, "sh_prom");
|
||||
|
||||
if (CGF.SanOpts.has(SanitizerKind::Shift) && !CGF.getLangOpts().OpenCL &&
|
||||
isa<llvm::IntegerType>(Ops.LHS->getType())) {
|
||||
// OpenCL 6.3j: shift values are effectively % word size of LHS.
|
||||
if (CGF.getLangOpts().OpenCL)
|
||||
RHS =
|
||||
Builder.CreateAnd(RHS, GetWidthMinusOneValue(Ops.LHS, RHS), "shr.mask");
|
||||
else if (CGF.SanOpts.has(SanitizerKind::ShiftExponent) &&
|
||||
isa<llvm::IntegerType>(Ops.LHS->getType())) {
|
||||
CodeGenFunction::SanitizerScope SanScope(&CGF);
|
||||
llvm::Value *Valid =
|
||||
Builder.CreateICmpULE(RHS, GetWidthMinusOneValue(Ops.LHS, RHS));
|
||||
EmitBinOpCheck(std::make_pair(Valid, SanitizerKind::Shift), Ops);
|
||||
EmitBinOpCheck(std::make_pair(Valid, SanitizerKind::ShiftExponent), Ops);
|
||||
}
|
||||
|
||||
// OpenCL 6.3j: shift values are effectively % word size of LHS.
|
||||
if (CGF.getLangOpts().OpenCL)
|
||||
RHS = Builder.CreateAnd(RHS, GetWidthMinusOneValue(Ops.LHS, RHS), "shr.mask");
|
||||
|
||||
if (Ops.Ty->hasUnsignedIntegerRepresentation())
|
||||
return Builder.CreateLShr(Ops.LHS, RHS, "shr");
|
||||
return Builder.CreateAShr(Ops.LHS, RHS, "shr");
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
// RUN: %clang_cc1 -fsanitize=alignment,null,object-size,shift,return,signed-integer-overflow,vla-bound,float-cast-overflow,integer-divide-by-zero,bool,returns-nonnull-attribute,nonnull-attribute -fsanitize-recover=alignment,null,object-size,shift,signed-integer-overflow,vla-bound,float-cast-overflow,integer-divide-by-zero,bool,returns-nonnull-attribute,nonnull-attribute -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s --check-prefix=CHECK-COMMON --check-prefix=CHECK-UBSAN
|
||||
// RUN: %clang_cc1 -fsanitize-undefined-trap-on-error -fsanitize=alignment,null,object-size,shift,return,signed-integer-overflow,vla-bound,float-cast-overflow,integer-divide-by-zero,bool,returns-nonnull-attribute,nonnull-attribute -fsanitize-recover=alignment,null,object-size,shift,signed-integer-overflow,vla-bound,float-cast-overflow,integer-divide-by-zero,bool,returns-nonnull-attribute,nonnull-attribute -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s --check-prefix=CHECK-COMMON --check-prefix=CHECK-TRAP
|
||||
// RUN: %clang_cc1 -fsanitize=alignment,null,object-size,shift-base,shift-exponent,return,signed-integer-overflow,vla-bound,float-cast-overflow,integer-divide-by-zero,bool,returns-nonnull-attribute,nonnull-attribute -fsanitize-recover=alignment,null,object-size,shift-base,shift-exponent,signed-integer-overflow,vla-bound,float-cast-overflow,integer-divide-by-zero,bool,returns-nonnull-attribute,nonnull-attribute -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s --check-prefix=CHECK-COMMON --check-prefix=CHECK-UBSAN
|
||||
// RUN: %clang_cc1 -fsanitize-undefined-trap-on-error -fsanitize=alignment,null,object-size,shift-base,shift-exponent,return,signed-integer-overflow,vla-bound,float-cast-overflow,integer-divide-by-zero,bool,returns-nonnull-attribute,nonnull-attribute -fsanitize-recover=alignment,null,object-size,shift-base,shift-exponent,signed-integer-overflow,vla-bound,float-cast-overflow,integer-divide-by-zero,bool,returns-nonnull-attribute,nonnull-attribute -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s --check-prefix=CHECK-COMMON --check-prefix=CHECK-TRAP
|
||||
// RUN: %clang_cc1 -fsanitize=null -fsanitize-recover=null -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s --check-prefix=CHECK-NULL
|
||||
// RUN: %clang_cc1 -fsanitize=signed-integer-overflow -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s --check-prefix=CHECK-OVERFLOW
|
||||
|
||||
|
@ -83,15 +83,19 @@ int addr_space(int __attribute__((address_space(256))) *a) {
|
|||
|
||||
// CHECK-COMMON-LABEL: @lsh_overflow
|
||||
int lsh_overflow(int a, int b) {
|
||||
// CHECK-COMMON: %[[INBOUNDS:.*]] = icmp ule i32 %[[RHS:.*]], 31
|
||||
// CHECK-COMMON-NEXT: br i1 %[[INBOUNDS]], label %[[CHECKBB:.*]], label %[[CONTBB:.*]]
|
||||
// CHECK-COMMON: %[[RHS_INBOUNDS:.*]] = icmp ule i32 %[[RHS:.*]], 31
|
||||
// CHECK-COMMON-NEXT: br i1 %[[RHS_INBOUNDS]], label %[[CHECK_BB:.*]], label %[[CONT_BB:.*]],
|
||||
|
||||
// CHECK-COMMON: %[[SHIFTED_OUT_WIDTH:.*]] = sub nuw nsw i32 31, %[[RHS]]
|
||||
// CHECK-COMMON: [[CHECK_BB]]:
|
||||
// CHECK-COMMON-NEXT: %[[SHIFTED_OUT_WIDTH:.*]] = sub nuw nsw i32 31, %[[RHS]]
|
||||
// CHECK-COMMON-NEXT: %[[SHIFTED_OUT:.*]] = lshr i32 %[[LHS:.*]], %[[SHIFTED_OUT_WIDTH]]
|
||||
// CHECK-COMMON-NEXT: %[[NO_OVERFLOW:.*]] = icmp eq i32 %[[SHIFTED_OUT]], 0
|
||||
// CHECK-COMMON-NEXT: br label %[[CONTBB]]
|
||||
// CHECK-COMMON-NEXT: br label %[[CONT_BB]]
|
||||
|
||||
// CHECK-COMMON: [[CONT_BB]]:
|
||||
// CHECK-COMMON-NEXT: %[[VALID_BASE:.*]] = phi i1 [ true, {{.*}} ], [ %[[NO_OVERFLOW]], %[[CHECK_BB]] ]
|
||||
// CHECK-COMMON-NEXT: %[[VALID:.*]] = and i1 %[[RHS_INBOUNDS]], %[[VALID_BASE]]
|
||||
|
||||
// CHECK-COMMON: %[[VALID:.*]] = phi i1 [ %[[INBOUNDS]], {{.*}} ], [ %[[NO_OVERFLOW]], %[[CHECKBB]] ]
|
||||
// CHECK-UBSAN: br i1 %[[VALID]], {{.*}} !prof ![[WEIGHT_MD]]
|
||||
// CHECK-TRAP: br i1 %[[VALID]]
|
||||
|
||||
|
@ -122,7 +126,7 @@ int rsh_inbounds(int a, int b) {
|
|||
// CHECK-TRAP: call void @llvm.trap() [[NR_NUW]]
|
||||
// CHECK-TRAP-NEXT: unreachable
|
||||
|
||||
// CHECK-COMMON: %[[RET:.*]] = ashr i32 %[[LHS]], %[[RHS]]
|
||||
// CHECK-COMMON: %[[RET:.*]] = ashr i32 {{.*}}, %[[RHS]]
|
||||
// CHECK-COMMON-NEXT: ret i32 %[[RET]]
|
||||
#line 400
|
||||
return a >> b;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// RUN: %clang_cc1 -std=c++11 -fsanitize=signed-integer-overflow,integer-divide-by-zero,float-divide-by-zero,shift,unreachable,return,vla-bound,alignment,null,vptr,object-size,float-cast-overflow,bool,enum,array-bounds,function -fsanitize-recover=signed-integer-overflow,integer-divide-by-zero,float-divide-by-zero,shift,vla-bound,alignment,null,vptr,object-size,float-cast-overflow,bool,enum,array-bounds,function -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s
|
||||
// RUN: %clang_cc1 -std=c++11 -fsanitize=signed-integer-overflow,integer-divide-by-zero,float-divide-by-zero,shift-base,shift-exponent,unreachable,return,vla-bound,alignment,null,vptr,object-size,float-cast-overflow,bool,enum,array-bounds,function -fsanitize-recover=signed-integer-overflow,integer-divide-by-zero,float-divide-by-zero,shift-base,shift-exponent,vla-bound,alignment,null,vptr,object-size,float-cast-overflow,bool,enum,array-bounds,function -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s
|
||||
// RUN: %clang_cc1 -std=c++11 -fsanitize=vptr,address -fsanitize-recover=vptr,address -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s --check-prefix=CHECK-ASAN
|
||||
// RUN: %clang_cc1 -std=c++11 -fsanitize=vptr -fsanitize-recover=vptr -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s --check-prefix=DOWNCAST-NULL
|
||||
// RUN: %clang_cc1 -std=c++11 -fsanitize=function -emit-llvm %s -o - -triple x86_64-linux-gnux32 | FileCheck %s --check-prefix=CHECK-X32
|
||||
|
@ -130,10 +130,11 @@ void member_access(S *p) {
|
|||
|
||||
// CHECK-LABEL: @_Z12lsh_overflow
|
||||
int lsh_overflow(int a, int b) {
|
||||
// CHECK: %[[INBOUNDS:.*]] = icmp ule i32 %[[RHS:.*]], 31
|
||||
// CHECK-NEXT: br i1 %[[INBOUNDS]]
|
||||
// CHECK: %[[RHS_INBOUNDS:.*]] = icmp ule i32 %[[RHS:.*]], 31
|
||||
// CHECK-NEXT: br i1 %[[RHS_INBOUNDS]], label %[[CHECK_BB:.*]], label %[[CONT_BB:.*]],
|
||||
|
||||
// CHECK: %[[SHIFTED_OUT_WIDTH:.*]] = sub nuw nsw i32 31, %[[RHS]]
|
||||
// CHECK: [[CHECK_BB]]:
|
||||
// CHECK-NEXT: %[[SHIFTED_OUT_WIDTH:.*]] = sub nuw nsw i32 31, %[[RHS]]
|
||||
// CHECK-NEXT: %[[SHIFTED_OUT:.*]] = lshr i32 %[[LHS:.*]], %[[SHIFTED_OUT_WIDTH]]
|
||||
|
||||
// This is present for C++11 but not for C: C++ core issue 1457 allows a '1'
|
||||
|
@ -141,8 +142,11 @@ int lsh_overflow(int a, int b) {
|
|||
// CHECK-NEXT: %[[SHIFTED_OUT_NOT_SIGN:.*]] = lshr i32 %[[SHIFTED_OUT]], 1
|
||||
|
||||
// CHECK-NEXT: %[[NO_OVERFLOW:.*]] = icmp eq i32 %[[SHIFTED_OUT_NOT_SIGN]], 0
|
||||
// CHECK-NEXT: br label %[[CONT_BB]]
|
||||
|
||||
// CHECK: %[[VALID:.*]] = phi i1 [ %[[INBOUNDS]], {{.*}} ], [ %[[NO_OVERFLOW]], {{.*}} ]
|
||||
// CHECK: [[CONT_BB]]:
|
||||
// CHECK-NEXT: %[[VALID_BASE:.*]] = phi i1 [ true, {{.*}} ], [ %[[NO_OVERFLOW]], %[[CHECK_BB]] ]
|
||||
// CHECK-NEXT: %[[VALID:.*]] = and i1 %[[RHS_INBOUNDS]], %[[VALID_BASE]]
|
||||
// CHECK-NEXT: br i1 %[[VALID]]
|
||||
|
||||
// CHECK: call void @__ubsan_handle_shift_out_of_bounds
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// RUN: %clang_cc1 -std=c++11 -fsanitize=signed-integer-overflow,integer-divide-by-zero,float-divide-by-zero,shift,unreachable,return,vla-bound,alignment,null,vptr,object-size,float-cast-overflow,bool,enum,array-bounds,function -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s
|
||||
// RUN: %clang_cc1 -std=c++11 -fsanitize=signed-integer-overflow,integer-divide-by-zero,float-divide-by-zero,shift-base,shift-exponent,unreachable,return,vla-bound,alignment,null,vptr,object-size,float-cast-overflow,bool,enum,array-bounds,function -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s
|
||||
|
||||
bool GetOptionalBool(bool *value);
|
||||
bool GetBool(bool default_value) {
|
||||
|
|
|
@ -1,16 +1,16 @@
|
|||
// RUN: %clang -target x86_64-linux-gnu -fsanitize=undefined-trap -fsanitize-undefined-trap-on-error %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-TRAP
|
||||
// RUN: %clang -target x86_64-linux-gnu -fsanitize-undefined-trap-on-error -fsanitize=undefined-trap %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-TRAP
|
||||
// CHECK-UNDEFINED-TRAP: "-fsanitize={{((signed-integer-overflow|integer-divide-by-zero|float-divide-by-zero|shift|unreachable|return|vla-bound|alignment|null|object-size|float-cast-overflow|array-bounds|enum|bool|returns-nonnull-attribute|nonnull-attribute),?){16}"}}
|
||||
// CHECK-UNDEFINED-TRAP: "-fsanitize={{((signed-integer-overflow|integer-divide-by-zero|float-divide-by-zero|shift-base|shift-exponent|unreachable|return|vla-bound|alignment|null|object-size|float-cast-overflow|array-bounds|enum|bool|returns-nonnull-attribute|nonnull-attribute),?){17}"}}
|
||||
// CHECK-UNDEFINED-TRAP: "-fsanitize-undefined-trap-on-error"
|
||||
|
||||
// RUN: %clang -target x86_64-linux-gnu -fsanitize=undefined %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED
|
||||
// CHECK-UNDEFINED: "-fsanitize={{((signed-integer-overflow|integer-divide-by-zero|float-divide-by-zero|function|shift|unreachable|return|vla-bound|alignment|null|vptr|object-size|float-cast-overflow|array-bounds|enum|bool|returns-nonnull-attribute|nonnull-attribute),?){18}"}}
|
||||
// CHECK-UNDEFINED: "-fsanitize={{((signed-integer-overflow|integer-divide-by-zero|float-divide-by-zero|function|shift-base|shift-exponent|unreachable|return|vla-bound|alignment|null|vptr|object-size|float-cast-overflow|array-bounds|enum|bool|returns-nonnull-attribute|nonnull-attribute),?){19}"}}
|
||||
|
||||
// RUN: %clang -target x86_64-apple-darwin10 -fsanitize=undefined %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-DARWIN
|
||||
// CHECK-UNDEFINED-DARWIN: "-fsanitize={{((signed-integer-overflow|integer-divide-by-zero|float-divide-by-zero|shift|unreachable|return|vla-bound|alignment|null|vptr|object-size|float-cast-overflow|array-bounds|enum|bool|returns-nonnull-attribute|nonnull-attribute),?){17}"}}
|
||||
// CHECK-UNDEFINED-DARWIN: "-fsanitize={{((signed-integer-overflow|integer-divide-by-zero|float-divide-by-zero|shift-base|shift-exponent|unreachable|return|vla-bound|alignment|null|vptr|object-size|float-cast-overflow|array-bounds|enum|bool|returns-nonnull-attribute|nonnull-attribute),?){18}"}}
|
||||
|
||||
// RUN: %clang -target x86_64-linux-gnu -fsanitize=integer %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-INTEGER
|
||||
// CHECK-INTEGER: "-fsanitize={{((signed-integer-overflow|unsigned-integer-overflow|integer-divide-by-zero|shift),?){4}"}}
|
||||
// CHECK-INTEGER: "-fsanitize={{((signed-integer-overflow|unsigned-integer-overflow|integer-divide-by-zero|shift-base|shift-exponent),?){5}"}}
|
||||
|
||||
// RUN: %clang -fsanitize=bounds -### -fsyntax-only %s 2>&1 | FileCheck %s --check-prefix=CHECK-BOUNDS
|
||||
// CHECK-BOUNDS: "-fsanitize={{((array-bounds|local-bounds),?){2}"}}
|
||||
|
@ -22,7 +22,10 @@
|
|||
// CHECK-FNO-SANITIZE-ALL: "-fsanitize=thread"
|
||||
|
||||
// RUN: %clang -target x86_64-linux-gnu -fsanitize=thread,undefined -fno-sanitize=thread -fno-sanitize=float-cast-overflow,vptr,bool,enum %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-PARTIAL-UNDEFINED
|
||||
// CHECK-PARTIAL-UNDEFINED: "-fsanitize={{((signed-integer-overflow|integer-divide-by-zero|float-divide-by-zero|function|shift|unreachable|return|vla-bound|alignment|null|object-size|array-bounds|returns-nonnull-attribute|nonnull-attribute),?){14}"}}
|
||||
// CHECK-PARTIAL-UNDEFINED: "-fsanitize={{((signed-integer-overflow|integer-divide-by-zero|float-divide-by-zero|function|shift-base|shift-exponent|unreachable|return|vla-bound|alignment|null|object-size|array-bounds|returns-nonnull-attribute|nonnull-attribute),?){15}"}}
|
||||
|
||||
// RUN: %clang -target x86_64-linux-gnu -fsanitize=shift -fno-sanitize=shift-base %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-FSANITIZE-SHIFT-PARTIAL
|
||||
// CHECK-FSANITIZE-SHIFT-PARTIAL: "-fsanitize=shift-exponent"
|
||||
|
||||
// RUN: %clang -target x86_64-linux-gnu -fsanitize=undefined -fsanitize-undefined-trap-on-error %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-TRAP-ON-ERROR-UNDEF
|
||||
// CHECK-UNDEFINED-TRAP-ON-ERROR-UNDEF: '-fsanitize=undefined' not allowed with '-fsanitize-undefined-trap-on-error'
|
||||
|
@ -143,11 +146,11 @@
|
|||
// RUN: %clang -target x86_64-linux-gnu %s -fsanitize=undefined -fno-sanitize-recover=all -fsanitize-recover=thread -### 2>&1 | FileCheck %s --check-prefix=CHECK-NO-RECOVER
|
||||
// RUN: %clang -target x86_64-linux-gnu %s -fsanitize=undefined -fno-sanitize-recover -fsanitize-recover=undefined -### 2>&1 | FileCheck %s --check-prefix=CHECK-RECOVER
|
||||
// RUN: %clang -target x86_64-linux-gnu %s -fsanitize=undefined -fsanitize-recover -fno-sanitize-recover -### 2>&1 | FileCheck %s --check-prefix=CHECK-NO-RECOVER
|
||||
// RUN: %clang -target x86_64-linux-gnu %s -fsanitize=undefined -fno-sanitize-recover=all -fsanitize-recover=object-size -### 2>&1 | FileCheck %s --check-prefix=CHECK-PARTIAL-RECOVER
|
||||
// RUN: %clang -target x86_64-linux-gnu %s -fsanitize=undefined -fno-sanitize-recover=all -fsanitize-recover=object-size,shift-base -### 2>&1 | FileCheck %s --check-prefix=CHECK-PARTIAL-RECOVER
|
||||
|
||||
// CHECK-RECOVER: "-fsanitize-recover={{((signed-integer-overflow|integer-divide-by-zero|float-divide-by-zero|function|shift|vla-bound|alignment|null|vptr|object-size|float-cast-overflow|array-bounds|enum|bool|returns-nonnull-attribute|nonnull-attribute),?){16}"}}
|
||||
// CHECK-RECOVER: "-fsanitize-recover={{((signed-integer-overflow|integer-divide-by-zero|float-divide-by-zero|function|shift-base|shift-exponent|vla-bound|alignment|null|vptr|object-size|float-cast-overflow|array-bounds|enum|bool|returns-nonnull-attribute|nonnull-attribute),?){17}"}}
|
||||
// CHECK-NO-RECOVER-NOT: sanitize-recover
|
||||
// CHECK-PARTIAL-RECOVER: "-fsanitize-recover=object-size"
|
||||
// CHECK-PARTIAL-RECOVER: "-fsanitize-recover={{((object-size|shift-base),?){2}"}}
|
||||
|
||||
// RUN: %clang -target x86_64-linux-gnu %s -fsanitize=undefined -fsanitize-recover=address,foobar,object-size,unreachable -### 2>&1 | FileCheck %s --check-prefix=CHECK-DIAG-RECOVER
|
||||
// CHECK-DIAG-RECOVER: unsupported argument 'foobar' to option 'fsanitize-recover='
|
||||
|
|
Loading…
Reference in New Issue