r193205 - Split -fsanitize=bounds to -fsanitize=array-bounds (for thefrontend-inserted
Richard Smith
richard at metafoo.co.uk
Thu Mar 20 14:38:21 PDT 2014
No, I don't think we still need that flag. It'd be more consistent to
remove it along with the other deprecated sanitizer flags.
On Thu, Mar 20, 2014 at 3:53 AM, Alexey Samsonov <samsonov at google.com>wrote:
> Do we still need -fbounds-checking flag? It's not documented in
> http://clang.llvm.org/docs/UsersManual.html, for instance.
>
>
> On Fri, Oct 25, 2013 at 1:28 AM, Nuno Lopes <nunoplopes at sapo.pt> wrote:
>
>> On Wed, Oct 23, 2013 at 2:58 PM, Nuno Lopes <nunoplopes at sapo.pt> wrote:
>>>
>>> Let me disagree with this change:
>>>> - I do not agree that '-fsanitize=local-bounds' is not a good
>>>> compromise.
>>>> It can detect overflows on globals, heap, and stack, including arbitrary
>>>> pointer arithmetic, and therefore it subsumes '-fsanitize=array-bounds'.
>>>> The advantage of the latter is that it produces nice diagnostics, while
>>>> the
>>>> former simply crashes the program when it detects an overflow.
>>>> Therefore, I
>>>> think there's value in keeping *both* instrumentations in
>>>> -fsanitize=undefined.
>>>>
>>>
>>>
>>> Yes, there is value in keeping both. But that doesn't argue for keeping
>>> this check in -fsanitize=undefined specifically -- all the other checks
>>> in
>>> -fsanitize=undefined are pure frontend checks that check source language
>>> rules and give nice diagnostics. It doesn't fit there. And if you run
>>> with
>>> "-fsanitize=address,undefined", this particular check provides no value.
>>> (-fsanitize=array-bounds does provide in such a configuration value,
>>> because it checks the language model for pointer arithmetic, not the LLVM
>>> IR rules, and so can detect some issues that ASan misses;
>>> -fsanitize=local-bounds is a pure subset of ASan.)
>>>
>>
>> '-fsanitize=local-bounds' is not a strict subset of ASan. It is possible
>> for ASan to miss certain overflows. It will catch the majority, but not
>> all. It's possible that '-fsanitize=local-bounds' detects an overflow that
>> ASan missed (and that valgrind misses). Moreover, it does not require a
>> runtime library (which is an advantage in certain use cases).
>>
>>
>>
>> Another issue is that local-bounds works by inserting a pass, which means
>>> that it does not work with LTO or in any other flow where the
>>> optimization
>>> passes are separated from IR emission.
>>>
>>
>> It should work with LTO. It can be run whenever the optimizations are run.
>>
>> My biggest concern is that most people will continue using
>> '-fsanitize=undefined' and will lose an important check that was previously
>> enabled.
>> Anyway, if this change is to be kept, the documentation needs to be
>> updated.
>>
>> Nuno
>>
>> P.S.: BTW, the bug in the pass has been fixed in the meantime.
>>
>>
>> BTW, '-fsanitize=local-bounds' properly inserts debug information in the
>>>> trap, and therefore you can use a debugger to pinpoint the offending
>>>> program statement.
>>>> - '-fsanitize=local-bounds' does not have false positives by design.
>>>> PR17653 is a bug which I'll fix soon. This pass was designed to have
>>>> zero
>>>> false positives.
>>>> - Also, I don't recall any previous discussion on this change..
>>>>
>>>
>>> Nuno
>>>
>>>>
>>>> ----- Original Message ----- From: "Richard Smith" <
>>>> richard-llvm at metafoo.co.uk>
>>>> Sent: Tuesday, October 22, 2013 11:51 PM
>>>> Subject: r193205 - Split -fsanitize=bounds to -fsanitize=array-bounds
>>>> (for
>>>> thefrontend-inserted
>>>>
>>>>
>>>>
>>>> Author: rsmith
>>>>
>>>>> Date: Tue Oct 22 17:51:04 2013
>>>>> New Revision: 193205
>>>>>
>>>>> URL: http://llvm.org/viewvc/llvm-**project?rev=193205&view=rev<ht
>>>>> tp://llvm.org/viewvc/llvm-project?rev=193205&view=rev>
>>>>>
>>>>> Log:
>>>>> Split -fsanitize=bounds to -fsanitize=array-bounds (for the
>>>>> frontend-inserted
>>>>> check using the ubsan runtime) and -fsanitize=local-bounds (for the
>>>>> middle-end
>>>>> check which inserts traps).
>>>>>
>>>>> Remove -fsanitize=local-bounds from -fsanitize=undefined. It does not
>>>>> produce
>>>>> useful diagnostics and has false positives (PR17635), and is not a good
>>>>> compromise position between UBSan's checks and ASan's checks.
>>>>>
>>>>> Map -fbounds-checking to -fsanitize=local-bounds to restore Clang's
>>>>> historical
>>>>> behavior for that flag.
>>>>>
>>>>> Modified:
>>>>> cfe/trunk/include/clang/Basic/**Sanitizers.def
>>>>> cfe/trunk/lib/CodeGen/**BackendUtil.cpp
>>>>> cfe/trunk/lib/CodeGen/CGExpr.**cpp
>>>>> cfe/trunk/lib/CodeGen/**CGExprScalar.cpp
>>>>> cfe/trunk/lib/Driver/**SanitizerArgs.cpp
>>>>> cfe/trunk/test/CodeGen/bounds-**checking.c
>>>>> cfe/trunk/test/CodeGenCXX/**catch-undef-behavior.cpp
>>>>> cfe/trunk/test/Driver/bounds-**checking.c
>>>>> cfe/trunk/test/Driver/**fsanitize.c
>>>>>
>>>>> Modified: cfe/trunk/include/clang/Basic/**Sanitizers.def
>>>>> URL: http://llvm.org/viewvc/llvm-**project/cfe/trunk/include/**
>>>>> clang/Basic/Sanitizers.def?**rev=193205&r1=193204&r2=**
>>>>> 193205&view=diff<http://llvm.org/viewvc/llvm-project/cfe/
>>>>> trunk/include/clang/Basic/Sanitizers.def?rev=193205&r1=
>>>>> 193204&r2=193205&view=diff>
>>>>> ==============================**==============================**
>>>>> ==================
>>>>> --- cfe/trunk/include/clang/Basic/**Sanitizers.def (original)
>>>>> +++ cfe/trunk/include/clang/Basic/**Sanitizers.def Tue Oct 22 17:51:04
>>>>>
>>>>> 2013
>>>>> @@ -59,8 +59,8 @@ SANITIZER("leak", Leak)
>>>>>
>>>>> // UndefinedBehaviorSanitizer
>>>>> SANITIZER("alignment", Alignment)
>>>>> +SANITIZER("array-bounds", ArrayBounds)
>>>>> SANITIZER("bool", Bool)
>>>>> -SANITIZER("bounds", Bounds)
>>>>> SANITIZER("enum", Enum)
>>>>> SANITIZER("float-cast-**overflow", FloatCastOverflow)
>>>>> SANITIZER("float-divide-by-**zero", FloatDivideByZero)
>>>>>
>>>>> @@ -84,7 +84,7 @@ SANITIZER("dataflow", DataFlow)
>>>>> // -fsanitize=undefined includes all the sanitizers which have low
>>>>> overhead, no
>>>>> // ABI or address space layout implications, and only catch undefined
>>>>> behavior.
>>>>> SANITIZER_GROUP("undefined", Undefined,
>>>>> - Alignment | Bool | Bounds | Enum | FloatCastOverflow |
>>>>> + Alignment | Bool | ArrayBounds | Enum |
>>>>> FloatCastOverflow |
>>>>> FloatDivideByZero | Function | IntegerDivideByZero |
>>>>> Null
>>>>> |
>>>>> ObjectSize | Return | Shift | SignedIntegerOverflow |
>>>>> Unreachable | VLABound | Vptr)
>>>>> @@ -94,7 +94,7 @@ SANITIZER_GROUP("undefined", Undefined,
>>>>> // runtime support. This group is generally used in conjunction with
>>>>> the
>>>>> // -fsanitize-undefined-trap-on-**error flag.
>>>>> SANITIZER_GROUP("undefined-**trap", UndefinedTrap,
>>>>>
>>>>> - Alignment | Bool | Bounds | Enum | FloatCastOverflow |
>>>>> + Alignment | Bool | ArrayBounds | Enum |
>>>>> FloatCastOverflow |
>>>>> FloatDivideByZero | IntegerDivideByZero | Null |
>>>>> ObjectSize |
>>>>> Return | Shift | SignedIntegerOverflow | Unreachable |
>>>>> VLABound)
>>>>> @@ -103,5 +103,9 @@ SANITIZER_GROUP("integer", Integer,
>>>>> SignedIntegerOverflow | UnsignedIntegerOverflow |
>>>>> Shift |
>>>>> IntegerDivideByZero)
>>>>>
>>>>> +// -fbounds-checking
>>>>> +SANITIZER("local-bounds", LocalBounds)
>>>>> +SANITIZER_GROUP("bounds", Bounds, ArrayBounds | LocalBounds)
>>>>> +
>>>>> #undef SANITIZER
>>>>> #undef SANITIZER_GROUP
>>>>>
>>>>> Modified: cfe/trunk/lib/CodeGen/**BackendUtil.cpp
>>>>> URL: http://llvm.org/viewvc/llvm-**project/cfe/trunk/lib/CodeGen/**
>>>>> BackendUtil.cpp?rev=193205&r1=**193204&r2=193205&view=diff<h
>>>>> ttp://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/
>>>>> BackendUtil.cpp?rev=193205&r1=193204&r2=193205&view=diff>
>>>>> ==============================**==============================**
>>>>> ==================
>>>>> --- cfe/trunk/lib/CodeGen/**BackendUtil.cpp (original)
>>>>> +++ cfe/trunk/lib/CodeGen/**BackendUtil.cpp Tue Oct 22 17:51:04 2013
>>>>> @@ -245,7 +245,7 @@ void EmitAssemblyHelper::**CreatePasses(Ta
>>>>> addObjCARCOptPass);
>>>>> }
>>>>>
>>>>> - if (LangOpts.Sanitize.Bounds) {
>>>>> + if (LangOpts.Sanitize.**LocalBounds) {
>>>>> PMBuilder.addExtension(**PassManagerBuilder::EP_**
>>>>> ScalarOptimizerLate,
>>>>> addBoundsCheckingPass);
>>>>>
>>>>> PMBuilder.addExtension(**PassManagerBuilder::EP_**EnabledOnOptLevel0,
>>>>>
>>>>> Modified: cfe/trunk/lib/CodeGen/CGExpr.**cpp
>>>>> URL: http://llvm.org/viewvc/llvm-**project/cfe/trunk/lib/CodeGen/**
>>>>> CGExpr.cpp?rev=193205&r1=**193204&r2=193205&view=diff<htt
>>>>> p://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/
>>>>> CGExpr.cpp?rev=193205&r1=193204&r2=193205&view=diff>
>>>>> ==============================**==============================**
>>>>> ==================
>>>>> --- cfe/trunk/lib/CodeGen/CGExpr.**cpp (original)
>>>>> +++ cfe/trunk/lib/CodeGen/CGExpr.**cpp Tue Oct 22 17:51:04 2013
>>>>>
>>>>> @@ -641,7 +641,8 @@ static llvm::Value *getArrayIndexingBoun
>>>>> void CodeGenFunction::**EmitBoundsCheck(const Expr *E, const Expr
>>>>> *Base,
>>>>>
>>>>> llvm::Value *Index, QualType
>>>>> IndexType,
>>>>> bool Accessed) {
>>>>> - assert(SanOpts->Bounds && "should not be called unless adding bounds
>>>>> checks");
>>>>> + assert(SanOpts->ArrayBounds &&
>>>>> + "should not be called unless adding bounds checks");
>>>>>
>>>>> QualType IndexedType;
>>>>> llvm::Value *Bound = getArrayIndexingBound(*this, Base, IndexedType);
>>>>> @@ -742,7 +743,7 @@ LValue CodeGenFunction::**EmitUnsupportedL
>>>>>
>>>>> LValue CodeGenFunction::**EmitCheckedLValue(const Expr *E,
>>>>> TypeCheckKind
>>>>>
>>>>> TCK) {
>>>>> LValue LV;
>>>>> - if (SanOpts->Bounds && isa<ArraySubscriptExpr>(E))
>>>>> + if (SanOpts->ArrayBounds && isa<ArraySubscriptExpr>(E))
>>>>> LV = EmitArraySubscriptExpr(cast<**ArraySubscriptExpr>(E),
>>>>>
>>>>> /*Accessed*/true);
>>>>> else
>>>>> LV = EmitLValue(E);
>>>>> @@ -2233,7 +2234,7 @@ LValue CodeGenFunction::**EmitArraySubscri
>>>>>
>>>>> QualType IdxTy = E->getIdx()->getType();
>>>>> bool IdxSigned = IdxTy->**isSignedIntegerOrEnumerationTy**pe();
>>>>>
>>>>>
>>>>> - if (SanOpts->Bounds)
>>>>> + if (SanOpts->ArrayBounds)
>>>>> EmitBoundsCheck(E, E->getBase(), Idx, IdxTy, Accessed);
>>>>>
>>>>> // If the base is a vector type, then we are forming a vector element
>>>>> lvalue
>>>>>
>>>>> Modified: cfe/trunk/lib/CodeGen/**CGExprScalar.cpp
>>>>> URL: http://llvm.org/viewvc/llvm-**project/cfe/trunk/lib/CodeGen/**
>>>>> CGExprScalar.cpp?rev=193205&**r1=193204&r2=193205&view=diff<
>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/
>>>>> CGExprScalar.cpp?rev=193205&r1=193204&r2=193205&view=diff>
>>>>> ==============================**==============================**
>>>>> ==================
>>>>> --- cfe/trunk/lib/CodeGen/**CGExprScalar.cpp (original)
>>>>> +++ cfe/trunk/lib/CodeGen/**CGExprScalar.cpp Tue Oct 22 17:51:04 2013
>>>>> @@ -1073,7 +1073,7 @@ Value *ScalarExprEmitter::**VisitArraySubs
>>>>>
>>>>> Value *Idx = Visit(E->getIdx());
>>>>> QualType IdxTy = E->getIdx()->getType();
>>>>>
>>>>> - if (CGF.SanOpts->Bounds)
>>>>> + if (CGF.SanOpts->ArrayBounds)
>>>>> CGF.EmitBoundsCheck(E, E->getBase(), Idx, IdxTy, /*Accessed*/true);
>>>>>
>>>>> bool IdxSigned = IdxTy->**isSignedIntegerOrEnumerationTy**pe();
>>>>>
>>>>> @@ -2314,7 +2314,7 @@ static Value *emitPointerArithmetic(Code
>>>>> if (isSubtraction)
>>>>> index = CGF.Builder.CreateNeg(index, "idx.neg");
>>>>>
>>>>> - if (CGF.SanOpts->Bounds)
>>>>> + if (CGF.SanOpts->ArrayBounds)
>>>>> CGF.EmitBoundsCheck(op.E, pointerOperand, index,
>>>>> indexOperand->getType(),
>>>>> /*Accessed*/ false);
>>>>>
>>>>>
>>>>> Modified: cfe/trunk/lib/Driver/**SanitizerArgs.cpp
>>>>> URL: http://llvm.org/viewvc/llvm-**project/cfe/trunk/lib/Driver/**
>>>>> SanitizerArgs.cpp?rev=193205&**r1=193204&r2=193205&view=diff<
>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/
>>>>> Driver/SanitizerArgs.cpp?rev=193205&r1=193204&r2=193205&view=diff>
>>>>> ==============================**==============================**
>>>>> ==================
>>>>> --- cfe/trunk/lib/Driver/**SanitizerArgs.cpp (original)
>>>>> +++ cfe/trunk/lib/Driver/**SanitizerArgs.cpp Tue Oct 22 17:51:04 2013
>>>>>
>>>>> @@ -256,8 +256,8 @@ bool SanitizerArgs::parse(const Driver &
>>>>> "-fsanitize=undefined-trap -fsanitize-undefined-trap-on-*
>>>>> *error";
>>>>> } else if (A->getOption().matches(**options::OPT_fbounds_checking)
>>>>> ||
>>>>>
>>>>> A->getOption().matches(**options::OPT_fbounds_checking_**EQ))
>>>>>
>>>>> {
>>>>> - Add = Bounds;
>>>>> - DeprecatedReplacement = "-fsanitize=bounds";
>>>>> + Add = LocalBounds;
>>>>> + DeprecatedReplacement = "-fsanitize=local-bounds";
>>>>> } else if (A->getOption().matches(**options::OPT_fsanitize_EQ)) {
>>>>>
>>>>> Add = parse(D, A, DiagnoseErrors);
>>>>> } else if (A->getOption().matches(**options::OPT_fno_sanitize_EQ)) {
>>>>>
>>>>> Modified: cfe/trunk/test/CodeGen/bounds-**checking.c
>>>>> URL: http://llvm.org/viewvc/llvm-**project/cfe/trunk/test/**
>>>>> CodeGen/bounds-checking.c?rev=**193205&r1=193204&r2=193205&*
>>>>> *view=diff<http://llvm.org/viewvc/llvm-project/cfe/trunk/
>>>>> test/CodeGen/bounds-checking.c?rev=193205&r1=193204&r2=
>>>>> 193205&view=diff>
>>>>> ==============================**==============================**
>>>>> ==================
>>>>> --- cfe/trunk/test/CodeGen/bounds-**checking.c (original)
>>>>> +++ cfe/trunk/test/CodeGen/bounds-**checking.c Tue Oct 22 17:51:04
>>>>> 2013
>>>>>
>>>>> @@ -1,26 +1,29 @@
>>>>> -// RUN: %clang_cc1 -fsanitize=bounds -emit-llvm -triple
>>>>> x86_64-apple-darwin10 < %s | FileCheck %s
>>>>> +// RUN: %clang_cc1 -fsanitize=local-bounds -emit-llvm -triple
>>>>> x86_64-apple-darwin10 %s -o - | FileCheck %s
>>>>> +// RUN: %clang_cc1 -fsanitize=array-bounds -O
>>>>> -fsanitize-undefined-trap-on-**error -emit-llvm -triple
>>>>>
>>>>> x86_64-apple-darwin10 -DNO_DYNAMIC %s -o - | FileCheck %s
>>>>>
>>>>> -// CHECK: @f
>>>>> +// CHECK-LABEL: @f
>>>>> double f(int b, int i) {
>>>>> double a[b];
>>>>> - // CHECK: trap
>>>>> + // CHECK: call {{.*}} @llvm.trap
>>>>> return a[i];
>>>>> }
>>>>>
>>>>> -// CHECK: @f2
>>>>> +// CHECK-LABEL: @f2
>>>>> void f2() {
>>>>> // everything is constant; no trap possible
>>>>> - // CHECK-NOT: trap
>>>>> + // CHECK-NOT: call {{.*}} @llvm.trap
>>>>> int a[2];
>>>>> a[1] = 42;
>>>>> -
>>>>> +
>>>>> +#ifndef NO_DYNAMIC
>>>>> short *b = malloc(64);
>>>>> b[5] = *a + a[1] + 2;
>>>>> +#endif
>>>>> }
>>>>>
>>>>> -// CHECK: @f3
>>>>> +// CHECK-LABEL: @f3
>>>>> void f3() {
>>>>> int a[1];
>>>>> - // CHECK: trap
>>>>> + // CHECK: call {{.*}} @llvm.trap
>>>>> a[2] = 1;
>>>>> }
>>>>>
>>>>> Modified: cfe/trunk/test/CodeGenCXX/**catch-undef-behavior.cpp
>>>>> URL: http://llvm.org/viewvc/llvm-**project/cfe/trunk/test/**
>>>>> CodeGenCXX/catch-undef-**behavior.cpp?rev=193205&r1=**
>>>>> 193204&r2=193205&view=diff<http://llvm.org/viewvc/llvm-
>>>>> project/cfe/trunk/test/CodeGenCXX/catch-undef-
>>>>> behavior.cpp?rev=193205&r1=193204&r2=193205&view=diff>
>>>>> ==============================**==============================**
>>>>> ==================
>>>>> --- cfe/trunk/test/CodeGenCXX/**catch-undef-behavior.cpp (original)
>>>>> +++ cfe/trunk/test/CodeGenCXX/**catch-undef-behavior.cpp Tue Oct 22
>>>>>
>>>>> 17:51:04 2013
>>>>> @@ -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,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,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
>>>>>
>>>>> struct S {
>>>>> double d;
>>>>>
>>>>> Modified: cfe/trunk/test/Driver/bounds-**checking.c
>>>>> URL: http://llvm.org/viewvc/llvm-**project/cfe/trunk/test/Driver/**
>>>>> bounds-checking.c?rev=193205&**r1=193204&r2=193205&view=diff<
>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/
>>>>> Driver/bounds-checking.c?rev=193205&r1=193204&r2=193205&view=diff>
>>>>> ==============================**==============================**
>>>>> ==================
>>>>> --- cfe/trunk/test/Driver/bounds-**checking.c (original)
>>>>> +++ cfe/trunk/test/Driver/bounds-**checking.c Tue Oct 22 17:51:04 2013
>>>>>
>>>>> @@ -1,11 +1,11 @@
>>>>> // RUN: %clang -fsanitize=bounds -### -fsyntax-only %s 2> %t
>>>>> // RUN: FileCheck -check-prefix=CHECK < %t %s
>>>>> -// CHECK: "-fsanitize=bounds"
>>>>> +// CHECK: "-fsanitize=array-bounds,**local-bounds"
>>>>>
>>>>>
>>>>> // RUN: %clang -fbounds-checking -### -fsyntax-only %s 2> %t
>>>>> // RUN: FileCheck -check-prefix=CHECK-OLD < %t %s
>>>>> -// CHECK-OLD: "-fsanitize=bounds"
>>>>> +// CHECK-OLD: "-fsanitize=local-bounds"
>>>>>
>>>>> // RUN: %clang -fbounds-checking=3 -### -fsyntax-only %s 2> %t
>>>>> // RUN: FileCheck -check-prefix=CHECK-OLD2 < %t %s
>>>>> -// CHECK-OLD2: "-fsanitize=bounds"
>>>>> +// CHECK-OLD2: "-fsanitize=local-bounds"
>>>>>
>>>>> Modified: cfe/trunk/test/Driver/**fsanitize.c
>>>>> URL: http://llvm.org/viewvc/llvm-**project/cfe/trunk/test/Driver/**
>>>>> fsanitize.c?rev=193205&r1=**193204&r2=193205&view=diff<htt
>>>>> p://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/
>>>>> fsanitize.c?rev=193205&r1=193204&r2=193205&view=diff>
>>>>> ==============================**==============================**
>>>>> ==================
>>>>> --- cfe/trunk/test/Driver/**fsanitize.c (original)
>>>>> +++ cfe/trunk/test/Driver/**fsanitize.c Tue Oct 22 17:51:04 2013
>>>>>
>>>>> @@ -1,17 +1,17 @@
>>>>> // RUN: %clang -target x86_64-linux-gnu -fcatch-undefined-behavior %s
>>>>> -### 2>&1 | FileCheck %s --check-prefix=CHECK-**UNDEFINED-TRAP
>>>>>
>>>>> // 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|bounds|enum|bool),?){**14}"}}
>>>>> +// 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),?){14}"}}
>>>>> // 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|**bounds|enum|bool),?){16}"}}
>>>>> +// 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),?){16}**"}}
>>>>>
>>>>>
>>>>> // 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}"}}
>>>>>
>>>>>
>>>>> // RUN: %clang -target x86_64-linux-gnu -fsanitize=thread,undefined
>>>>> -fno-thread-sanitizer -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|**bounds),?){12}"}}
>>>>> +// 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),?){12}"}}
>>>>>
>>>>>
>>>>> // RUN: %clang -target x86_64-linux-gnu -fsanitize=address-full %s -###
>>>>> 2>&1 | FileCheck %s --check-prefix=CHECK-ASAN-FULL
>>>>> // CHECK-ASAN-FULL: "-fsanitize={{((address|init-**
>>>>> order|use-after-return|use-**after-scope),?){4}"}}
>>>>>
>>>>> @@ -101,7 +101,7 @@
>>>>> // CHECK-DEPRECATED: argument '-fno-thread-sanitizer' is deprecated,
>>>>> use
>>>>> '-fno-sanitize=thread' instead
>>>>> // CHECK-DEPRECATED: argument '-faddress-sanitizer' is deprecated, use
>>>>> '-fsanitize=address' instead
>>>>> // CHECK-DEPRECATED: argument '-fno-address-sanitizer' is deprecated,
>>>>> use
>>>>> '-fno-sanitize=address' instead
>>>>> -// CHECK-DEPRECATED: argument '-fbounds-checking' is deprecated, use
>>>>> '-fsanitize=bounds' instead
>>>>> +// CHECK-DEPRECATED: argument '-fbounds-checking' is deprecated, use
>>>>> '-fsanitize=local-bounds' instead
>>>>>
>>>>> // RUN: %clang -target x86_64-linux-gnu -fsanitize=thread %s -### 2>&1
>>>>> |
>>>>> FileCheck %s --check-prefix=CHECK-TSAN-NO-**PIE
>>>>>
>>>>> // CHECK-TSAN-NO-PIE: "-mrelocation-model" "pic" "-pic-level" "2"
>>>>> "-pie-level" "2"
>>>>>
>>>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
>
>
>
> --
> Alexey Samsonov, MSK
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140320/a7647983/attachment.html>
More information about the cfe-commits
mailing list