r309007 - [ubsan] Null-check pointers in -fsanitize=vptr (PR33881)

Hans Wennborg via cfe-commits cfe-commits at lists.llvm.org
Mon Jul 31 09:37:53 PDT 2017


/sub

I believe Vedant asked for this to be merged to 5.0, so I'd like to
merge the resolution too.

On Mon, Jul 31, 2017 at 8:51 AM, Nico Weber via cfe-commits
<cfe-commits at lists.llvm.org> wrote:
> Hi Vedant,
>
> after this change our ubsanvptr bot fails like so:
>
> clang-6.0: error: implicitly disabling vptr sanitizer because null checking
> wasn't enabled [-Werror,-Wauto-disable-vptr-sanitizer]
>
> The bot uses -fsanitize=vptr. I have no idea what this warning is supposed
> to tell me. Maybe it could be reworded, or maybe it shouldn't be emitted?
>
> Thanks,
> Nico
>
> On Tue, Jul 25, 2017 at 3:34 PM, Vedant Kumar via cfe-commits
> <cfe-commits at lists.llvm.org> wrote:
>>
>> Author: vedantk
>> Date: Tue Jul 25 12:34:23 2017
>> New Revision: 309007
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=309007&view=rev
>> Log:
>> [ubsan] Null-check pointers in -fsanitize=vptr (PR33881)
>>
>> The instrumentation generated by -fsanitize=vptr does not null check a
>> user pointer before loading from it. This causes crashes in the face of
>> UB member calls (this=nullptr), i.e it's causing user programs to crash
>> only after UBSan is turned on.
>>
>> The fix is to make run-time null checking a prerequisite for enabling
>> -fsanitize=vptr, and to then teach UBSan to reuse these run-time null
>> checks to make -fsanitize=vptr safe.
>>
>> Testing: check-clang, check-ubsan, a stage2 ubsan-enabled build
>>
>> Differential Revision: https://reviews.llvm.org/D35735
>>
>> https://bugs.llvm.org/show_bug.cgi?id=33881
>>
>> Modified:
>>     cfe/trunk/docs/ReleaseNotes.rst
>>     cfe/trunk/docs/UndefinedBehaviorSanitizer.rst
>>     cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td
>>     cfe/trunk/include/clang/Basic/DiagnosticGroups.td
>>     cfe/trunk/lib/CodeGen/CGExpr.cpp
>>     cfe/trunk/lib/Driver/SanitizerArgs.cpp
>>     cfe/trunk/test/CodeGenCXX/catch-undef-behavior.cpp
>>     cfe/trunk/test/CodeGenCXX/ubsan-devirtualized-calls.cpp
>>     cfe/trunk/test/CodeGenCXX/ubsan-type-checks.cpp
>>     cfe/trunk/test/CodeGenCXX/ubsan-vtable-checks.cpp
>>     cfe/trunk/test/Driver/fsanitize.c
>>     cfe/trunk/test/Driver/rtti-options.cpp
>>
>> Modified: cfe/trunk/docs/ReleaseNotes.rst
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/ReleaseNotes.rst?rev=309007&r1=309006&r2=309007&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/docs/ReleaseNotes.rst (original)
>> +++ cfe/trunk/docs/ReleaseNotes.rst Tue Jul 25 12:34:23 2017
>> @@ -155,7 +155,9 @@ Static Analyzer
>>  Undefined Behavior Sanitizer (UBSan)
>>  ------------------------------------
>>
>> -...
>> +The C++ dynamic type check now requires run-time null checking (i.e,
>> +`-fsanitize=vptr` cannot be used without `-fsanitize=null`). This change
>> does
>> +not impact users who rely on UBSan check groups (e.g
>> `-fsanitize=undefined`).
>>
>>  Core Analysis Improvements
>>  ==========================
>>
>> Modified: cfe/trunk/docs/UndefinedBehaviorSanitizer.rst
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/UndefinedBehaviorSanitizer.rst?rev=309007&r1=309006&r2=309007&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/docs/UndefinedBehaviorSanitizer.rst (original)
>> +++ cfe/trunk/docs/UndefinedBehaviorSanitizer.rst Tue Jul 25 12:34:23 2017
>> @@ -130,11 +130,11 @@ Available checks are:
>>       it is often unintentional, so UBSan offers to catch it.
>>    -  ``-fsanitize=vla-bound``: A variable-length array whose bound
>>       does not evaluate to a positive value.
>> -  -  ``-fsanitize=vptr``: Use of an object whose vptr indicates that
>> -     it is of the wrong dynamic type, or that its lifetime has not
>> -     begun or has ended. Incompatible with ``-fno-rtti``. Link must
>> -     be performed by ``clang++``, not ``clang``, to make sure
>> C++-specific
>> -     parts of the runtime library and C++ standard libraries are present.
>> +  -  ``-fsanitize=vptr``: Use of an object whose vptr indicates that it
>> is of
>> +     the wrong dynamic type, or that its lifetime has not begun or has
>> ended.
>> +     Incompatible with ``-fno-rtti`` and ``-fno-sanitize=null``. Link
>> must be
>> +     performed by ``clang++``, not ``clang``, to make sure C++-specific
>> parts of
>> +     the runtime library and C++ standard libraries are present.
>>
>>  You can also use the following check groups:
>>    -  ``-fsanitize=undefined``: All of the checks listed above other than
>>
>> Modified: cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td?rev=309007&r1=309006&r2=309007&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td (original)
>> +++ cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td Tue Jul 25
>> 12:34:23 2017
>> @@ -230,7 +230,10 @@ def warn_drv_enabling_rtti_with_exceptio
>>    InGroup<DiagGroup<"rtti-for-exceptions">>;
>>  def warn_drv_disabling_vptr_no_rtti_default : Warning<
>>    "implicitly disabling vptr sanitizer because rtti wasn't enabled">,
>> -  InGroup<DiagGroup<"auto-disable-vptr-sanitizer">>;
>> +  InGroup<AutoDisableVptrSanitizer>;
>> +def warn_drv_disabling_vptr_no_null_check : Warning<
>> +  "implicitly disabling vptr sanitizer because null checking wasn't
>> enabled">,
>> +  InGroup<AutoDisableVptrSanitizer>;
>>  def warn_drv_object_size_disabled_O0 : Warning<
>>    "the object size sanitizer has no effect at -O0, but is explicitly
>> enabled: %0">,
>>    InGroup<InvalidCommandLineArgument>;
>>
>> Modified: cfe/trunk/include/clang/Basic/DiagnosticGroups.td
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticGroups.td?rev=309007&r1=309006&r2=309007&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/include/clang/Basic/DiagnosticGroups.td (original)
>> +++ cfe/trunk/include/clang/Basic/DiagnosticGroups.td Tue Jul 25 12:34:23
>> 2017
>> @@ -27,6 +27,7 @@ def GNUAnonymousStruct : DiagGroup<"gnu-
>>  def GNUAutoType : DiagGroup<"gnu-auto-type">;
>>  def ArrayBounds : DiagGroup<"array-bounds">;
>>  def ArrayBoundsPointerArithmetic :
>> DiagGroup<"array-bounds-pointer-arithmetic">;
>> +def AutoDisableVptrSanitizer : DiagGroup<"auto-disable-vptr-sanitizer">;
>>  def Availability : DiagGroup<"availability">;
>>  def Section : DiagGroup<"section">;
>>  def AutoImport : DiagGroup<"auto-import">;
>>
>> Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=309007&r1=309006&r2=309007&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CGExpr.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CGExpr.cpp Tue Jul 25 12:34:23 2017
>> @@ -604,20 +604,23 @@ void CodeGenFunction::EmitTypeCheck(Type
>>    auto PtrToAlloca =
>>
>> dyn_cast<llvm::AllocaInst>(Ptr->stripPointerCastsNoFollowAliases());
>>
>> +  llvm::Value *IsNonNull = nullptr;
>> +  bool IsGuaranteedNonNull =
>> +      SkippedChecks.has(SanitizerKind::Null) || PtrToAlloca;
>>    bool AllowNullPointers = TCK == TCK_DowncastPointer || TCK ==
>> TCK_Upcast ||
>>                             TCK == TCK_UpcastToVirtualBase;
>>    if ((SanOpts.has(SanitizerKind::Null) || AllowNullPointers) &&
>> -      !SkippedChecks.has(SanitizerKind::Null) && !PtrToAlloca) {
>> +      !IsGuaranteedNonNull) {
>>      // The glvalue must not be an empty glvalue.
>> -    llvm::Value *IsNonNull = Builder.CreateIsNotNull(Ptr);
>> +    IsNonNull = Builder.CreateIsNotNull(Ptr);
>>
>>      // The IR builder can constant-fold the null check if the pointer
>> points to
>>      // a constant.
>> -    bool PtrIsNonNull =
>> +    IsGuaranteedNonNull =
>>          IsNonNull == llvm::ConstantInt::getTrue(getLLVMContext());
>>
>>      // Skip the null check if the pointer is known to be non-null.
>> -    if (!PtrIsNonNull) {
>> +    if (!IsGuaranteedNonNull) {
>>        if (AllowNullPointers) {
>>          // When performing pointer casts, it's OK if the value is null.
>>          // Skip the remaining checks in that case.
>> @@ -691,12 +694,24 @@ void CodeGenFunction::EmitTypeCheck(Type
>>    //    -- the [pointer or glvalue] is used to access a non-static data
>> member
>>    //       or call a non-static member function
>>    CXXRecordDecl *RD = Ty->getAsCXXRecordDecl();
>> +  bool HasNullCheck = IsGuaranteedNonNull || IsNonNull;
>>    if (SanOpts.has(SanitizerKind::Vptr) &&
>> -      !SkippedChecks.has(SanitizerKind::Vptr) &&
>> +      !SkippedChecks.has(SanitizerKind::Vptr) && HasNullCheck &&
>>        (TCK == TCK_MemberAccess || TCK == TCK_MemberCall ||
>>         TCK == TCK_DowncastPointer || TCK == TCK_DowncastReference ||
>>         TCK == TCK_UpcastToVirtualBase) &&
>>        RD && RD->hasDefinition() && RD->isDynamicClass()) {
>> +    // Ensure that the pointer is non-null before loading it. If there is
>> no
>> +    // compile-time guarantee, reuse the run-time null check.
>> +    if (!IsGuaranteedNonNull) {
>> +      assert(IsNonNull && "Missing run-time null check");
>> +      if (!Done)
>> +        Done = createBasicBlock("vptr.null");
>> +      llvm::BasicBlock *VptrNotNull = createBasicBlock("vptr.not.null");
>> +      Builder.CreateCondBr(IsNonNull, VptrNotNull, Done);
>> +      EmitBlock(VptrNotNull);
>> +    }
>> +
>>      // Compute a hash of the mangled name of the type.
>>      //
>>      // FIXME: This is not guaranteed to be deterministic! Move to a
>>
>> Modified: cfe/trunk/lib/Driver/SanitizerArgs.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/SanitizerArgs.cpp?rev=309007&r1=309006&r2=309007&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Driver/SanitizerArgs.cpp (original)
>> +++ cfe/trunk/lib/Driver/SanitizerArgs.cpp Tue Jul 25 12:34:23 2017
>> @@ -306,6 +306,13 @@ SanitizerArgs::SanitizerArgs(const ToolC
>>      Kinds &= ~Vptr;
>>    }
>>
>> +  // Disable -fsanitize=vptr if -fsanitize=null is not enabled (the vptr
>> +  // instrumentation is broken without run-time null checks).
>> +  if ((Kinds & Vptr) && !(Kinds & Null)) {
>> +    Kinds &= ~Vptr;
>> +    D.Diag(diag::warn_drv_disabling_vptr_no_null_check);
>> +  }
>> +
>>    // Check that LTO is enabled if we need it.
>>    if ((Kinds & NeedsLTO) && !D.isUsingLTO()) {
>>      D.Diag(diag::err_drv_argument_only_allowed_with)
>>
>> 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=309007&r1=309006&r2=309007&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/test/CodeGenCXX/catch-undef-behavior.cpp (original)
>> +++ cfe/trunk/test/CodeGenCXX/catch-undef-behavior.cpp Tue Jul 25 12:34:23
>> 2017
>> @@ -1,6 +1,6 @@
>>  // 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 | opt -instnamer -S | 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=null,vptr,address
>> -fsanitize-recover=null,vptr,address -emit-llvm %s -o - -triple
>> x86_64-linux-gnu | FileCheck %s --check-prefix=CHECK-ASAN
>> +// RUN: %clang_cc1 -std=c++11 -fsanitize=null,vptr
>> -fsanitize-recover=null,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
>>  // RUN: %clang_cc1 -std=c++11 -fsanitize=function -emit-llvm %s -o -
>> -triple i386-linux-gnu | FileCheck %s --check-prefix=CHECK-X86
>>
>>
>> Modified: cfe/trunk/test/CodeGenCXX/ubsan-devirtualized-calls.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/ubsan-devirtualized-calls.cpp?rev=309007&r1=309006&r2=309007&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/test/CodeGenCXX/ubsan-devirtualized-calls.cpp (original)
>> +++ cfe/trunk/test/CodeGenCXX/ubsan-devirtualized-calls.cpp Tue Jul 25
>> 12:34:23 2017
>> @@ -1,4 +1,4 @@
>> -// RUN: %clang_cc1 -std=c++11 -triple %itanium_abi_triple -emit-llvm
>> -fsanitize=vptr %s -o - | FileCheck %s
>> +// RUN: %clang_cc1 -std=c++11 -triple %itanium_abi_triple -emit-llvm
>> -fsanitize=null,vptr %s -o - | FileCheck %s
>>
>>  struct Base1 {
>>    virtual void f1() {}
>> @@ -64,6 +64,11 @@ void t4() {
>>    // CHECK-NEXT: call void
>> @__ubsan_handle_dynamic_type_cache{{[_a-z]*}}({{.*}} [[UBSAN_TI_DERIVED3]]
>> {{.*}}, i{{[0-9]+}} %[[P1]]
>>
>>    static_cast<Base1 *>(badp)->f1(); //< No devirt, test 'badp isa Base1'.
>> +  // We were able to skip the null check on the first type check because
>> 'p'
>> +  // is backed by an alloca. We can't skip the second null check because
>> 'badp'
>> +  // is a (bitcast (load ...)).
>> +  // CHECK: call void @__ubsan_handle_type_mismatch
>> +  //
>>    // CHECK: %[[BADP1:[0-9]+]] = ptrtoint %struct.Base1* {{%[0-9]+}} to
>> i{{[0-9]+}}, !nosanitize
>>    // CHECK-NEXT: call void
>> @__ubsan_handle_dynamic_type_cache{{[_a-z]*}}({{.*}} [[UBSAN_TI_BASE1]]
>> {{.*}}, i{{[0-9]+}} %[[BADP1]]
>>  }
>> @@ -76,6 +81,8 @@ void t5() {
>>    // CHECK-NEXT: call void
>> @__ubsan_handle_dynamic_type_cache{{[_a-z]*}}({{.*}} [[UBSAN_TI_DERIVED4_1]]
>> {{.*}}, i{{[0-9]+}} %[[P1]]
>>
>>    static_cast<Base1 *>(badp)->f1(); //< Devirt Base1::f1 to Derived4::f1.
>> +  // CHECK: call void @__ubsan_handle_type_mismatch
>> +  //
>>    // CHECK: %[[BADP1:[0-9]+]] = ptrtoint %struct.Derived4* {{%[0-9]+}} to
>> i{{[0-9]+}}, !nosanitize
>>    // CHECK-NEXT: call void
>> @__ubsan_handle_dynamic_type_cache{{[_a-z]*}}({{.*}} [[UBSAN_TI_DERIVED4_2]]
>> {{.*}}, i{{[0-9]+}} %[[BADP1]]
>>  }
>>
>> Modified: cfe/trunk/test/CodeGenCXX/ubsan-type-checks.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/ubsan-type-checks.cpp?rev=309007&r1=309006&r2=309007&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/test/CodeGenCXX/ubsan-type-checks.cpp (original)
>> +++ cfe/trunk/test/CodeGenCXX/ubsan-type-checks.cpp Tue Jul 25 12:34:23
>> 2017
>> @@ -1,6 +1,8 @@
>>  // RUN: %clang_cc1 -std=c++11 -triple x86_64-apple-darwin10 -emit-llvm -o
>> - %s -fsanitize=alignment | FileCheck %s -check-prefixes=ALIGN,COMMON
>>  // RUN: %clang_cc1 -std=c++11 -triple x86_64-apple-darwin10 -emit-llvm -o
>> - %s -fsanitize=null | FileCheck %s -check-prefixes=NULL,COMMON
>>  // RUN: %clang_cc1 -std=c++11 -triple x86_64-apple-darwin10 -emit-llvm -o
>> - %s -fsanitize=object-size | FileCheck %s -check-prefixes=OBJSIZE,COMMON
>> +// RUN: %clang_cc1 -std=c++11 -triple x86_64-apple-darwin10 -emit-llvm -o
>> - %s -fsanitize=null,vptr | FileCheck %s -check-prefixes=VPTR
>> +// RUN: %clang_cc1 -std=c++11 -triple x86_64-apple-darwin10 -emit-llvm -o
>> - %s -fsanitize=vptr | FileCheck %s -check-prefixes=VPTR_NO_NULL
>>
>>  struct A {
>>    // COMMON-LABEL: define linkonce_odr void @_ZN1A10do_nothingEv
>> @@ -24,13 +26,55 @@ struct B {
>>      // NULL: icmp ne %struct.B* %{{.*}}, null, !nosanitize
>>
>>      // OBJSIZE-NOT: call i64 @llvm.objectsize
>> +    // OBJSIZE: ret void
>>    }
>>  };
>>
>> -void force_irgen() {
>> +struct Animal {
>> +  virtual const char *speak() = 0;
>> +};
>> +
>> +struct Cat : Animal {
>> +  const char *speak() override { return "meow"; }
>> +};
>> +
>> +struct Dog : Animal {
>> +  const char *speak() override { return "woof"; }
>> +};
>> +
>> +// VPTR-LABEL: define void @_Z12invalid_castP3Cat
>> +void invalid_cast(Cat *cat = nullptr) {
>> +  // First, null check the pointer:
>> +  //
>> +  // VPTR: [[ICMP:%.*]] = icmp ne %struct.Dog* {{.*}}, null
>> +  // VPTR-NEXT: br i1 [[ICMP]]
>> +  // VPTR: call void @__ubsan_handle_type_mismatch
>> +  //
>> +  // Once we're done emitting the null check, reuse the check to see if
>> we can
>> +  // proceed to the vptr check:
>> +  //
>> +  // VPTR: br i1 [[ICMP]]
>> +  // VPTR: call void @__ubsan_handle_dynamic_type_cache_miss
>> +  auto *badDog = reinterpret_cast<Dog *>(cat);
>> +  badDog->speak();
>> +}
>> +
>> +// VPTR_NO_NULL-LABEL: define void @_Z13invalid_cast2v
>> +void invalid_cast2() {
>> +  // We've got a pointer to an alloca, so there's no run-time null check
>> needed.
>> +  // VPTR_NO_NULL-NOT: call void @__ubsan_handle_type_mismatch
>> +  // VPTR_NO_NULL: call void @__ubsan_handle_dynamic_type_cache_miss
>> +  Cat cat;
>> +  cat.speak();
>> +}
>> +
>> +int main() {
>>    A a;
>>    a.do_nothing();
>>
>>    B b;
>>    b.do_nothing();
>> +
>> +  invalid_cast();
>> +  return 0;
>>  }
>>
>> Modified: cfe/trunk/test/CodeGenCXX/ubsan-vtable-checks.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/ubsan-vtable-checks.cpp?rev=309007&r1=309006&r2=309007&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/test/CodeGenCXX/ubsan-vtable-checks.cpp (original)
>> +++ cfe/trunk/test/CodeGenCXX/ubsan-vtable-checks.cpp Tue Jul 25 12:34:23
>> 2017
>> @@ -1,7 +1,7 @@
>>  // RUN: %clang_cc1 -std=c++11 -triple x86_64-unknown-linux -emit-llvm
>> -fsanitize=null %s -o - | FileCheck %s --check-prefix=CHECK
>> --check-prefix=CHECK-NULL --check-prefix=ITANIUM
>>  // RUN: %clang_cc1 -std=c++11 -triple x86_64-windows -emit-llvm
>> -fsanitize=null %s -o - | FileCheck %s --check-prefix=CHECK
>> --check-prefix=CHECK-NULL --check-prefix=MSABI
>> -// RUN: %clang_cc1 -std=c++11 -triple x86_64-unknown-linux -emit-llvm
>> -fsanitize=vptr %s -o - | FileCheck %s --check-prefix=CHECK
>> --check-prefix=CHECK-VPTR --check-prefix=ITANIUM
>> -// RUN: %clang_cc1 -std=c++11 -triple x86_64-windows -emit-llvm
>> -fsanitize=vptr %s -o - | FileCheck %s --check-prefix=CHECK
>> --check-prefix=CHECK-VPTR --check-prefix=MSABI
>> +// RUN: %clang_cc1 -std=c++11 -triple x86_64-unknown-linux -emit-llvm
>> -fsanitize=null,vptr %s -o - | FileCheck %s --check-prefix=CHECK
>> --check-prefix=CHECK-VPTR --check-prefix=ITANIUM
>> +// RUN: %clang_cc1 -std=c++11 -triple x86_64-windows -emit-llvm
>> -fsanitize=null,vptr %s -o - | FileCheck %s --check-prefix=CHECK
>> --check-prefix=CHECK-VPTR --check-prefix=MSABI
>>  struct T {
>>    virtual ~T() {}
>>    virtual int v() { return 1; }
>>
>> Modified: cfe/trunk/test/Driver/fsanitize.c
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/fsanitize.c?rev=309007&r1=309006&r2=309007&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/test/Driver/fsanitize.c (original)
>> +++ cfe/trunk/test/Driver/fsanitize.c Tue Jul 25 12:34:23 2017
>> @@ -58,6 +58,10 @@
>>  // RUN: %clang -target x86_64-linux-gnu -fsanitize=undefined -fno-rtti %s
>> -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-NO-RTTI
>>  // CHECK-UNDEFINED-NO-RTTI-NOT: vptr
>>
>> +// RUN: %clang -target x86_64-linux-gnu -fsanitize=undefined
>> -fno-sanitize=null %s -### 2>&1 | FileCheck %s
>> --check-prefix=CHECK-VPTR-NO-NULL
>> +// RUN: %clang -target x86_64-linux-gnu -fsanitize=vptr %s -### 2>&1 |
>> FileCheck %s --check-prefix=CHECK-VPTR-NO-NULL
>> +// CHECK-VPTR-NO-NULL: warning: implicitly disabling vptr sanitizer
>> because null checking wasn't enabled
>> +
>>  // RUN: %clang -target x86_64-linux-gnu -fsanitize=address,thread
>> -fno-rtti %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANA-SANT
>>  // CHECK-SANA-SANT: '-fsanitize=address' not allowed with
>> '-fsanitize=thread'
>>
>> @@ -362,8 +366,8 @@
>>  // RUN: %clang -target x86_64-apple-darwin10 -mmacosx-version-min=10.8
>> -fsanitize=vptr %s -### 2>&1 | FileCheck %s
>> --check-prefix=CHECK-VPTR-DARWIN-OLD
>>  // CHECK-VPTR-DARWIN-OLD: unsupported option '-fsanitize=vptr' for target
>> 'x86_64-apple-darwin10'
>>
>> -// RUN: %clang -target x86_64-apple-darwin10 -mmacosx-version-min=10.9
>> -fsanitize=alignment,vptr %s -### 2>&1 | FileCheck %s
>> --check-prefix=CHECK-VPTR-DARWIN-NEW
>> -// CHECK-VPTR-DARWIN-NEW: -fsanitize=alignment,vptr
>> +// RUN: %clang -target x86_64-apple-darwin10 -mmacosx-version-min=10.9
>> -fsanitize=alignment,null,vptr %s -### 2>&1 | FileCheck %s
>> --check-prefix=CHECK-VPTR-DARWIN-NEW
>> +// CHECK-VPTR-DARWIN-NEW: -fsanitize=alignment,null,vptr
>>
>>  // RUN: %clang -target armv7-apple-ios7 -miphoneos-version-min=7.0
>> -fsanitize=address %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-ASAN-IOS
>>  // CHECK-ASAN-IOS: -fsanitize=address
>>
>> Modified: cfe/trunk/test/Driver/rtti-options.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/rtti-options.cpp?rev=309007&r1=309006&r2=309007&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/test/Driver/rtti-options.cpp (original)
>> +++ cfe/trunk/test/Driver/rtti-options.cpp Tue Jul 25 12:34:23 2017
>> @@ -16,14 +16,14 @@
>>  // Make sure we only error/warn once, when trying to enable vptr and
>>  // undefined and have -fno-rtti
>>  // RUN: %clang -### -c -target x86_64-unknown-linux -fsanitize=undefined
>> -fsanitize=vptr -fno-rtti %s 2>&1 | FileCheck -check-prefix=CHECK-SAN-ERROR
>> -check-prefix=CHECK-OK %s
>> -// RUN: %clang -### -c -target x86_64-unknown-linux -fsanitize=vptr %s
>> 2>&1 | FileCheck -check-prefix=CHECK-OK %s
>> -// RUN: %clang -### -c -target x86_64-unknown-linux -fsanitize=vptr
>> -frtti %s 2>&1 | FileCheck -check-prefix=CHECK-OK %s
>> -// RUN: %clang -### -c -target x86_64-unknown-linux -fsanitize=vptr
>> -fno-rtti %s 2>&1 | FileCheck -check-prefix=CHECK-SAN-ERROR %s
>> +// RUN: %clang -### -c -target x86_64-unknown-linux -fsanitize=null,vptr
>> %s 2>&1 | FileCheck -check-prefix=CHECK-OK %s
>> +// RUN: %clang -### -c -target x86_64-unknown-linux -fsanitize=null,vptr
>> -frtti %s 2>&1 | FileCheck -check-prefix=CHECK-OK %s
>> +// RUN: %clang -### -c -target x86_64-unknown-linux -fsanitize=null,vptr
>> -fno-rtti %s 2>&1 | FileCheck -check-prefix=CHECK-SAN-ERROR %s
>>  // RUN: %clang -### -c -target x86_64-unknown-linux -fsanitize=undefined
>> %s 2>&1 | FileCheck -check-prefix=CHECK-OK %s
>>  // RUN: %clang -### -c -target x86_64-unknown-linux -fsanitize=undefined
>> -frtti %s 2>&1 | FileCheck -check-prefix=CHECK-OK %s
>> -// RUN: %clang -### -c -target x86_64-scei-ps4 -fsanitize=vptr %s 2>&1 |
>> FileCheck -check-prefix=CHECK-SAN-WARN %s
>> -// RUN: %clang -### -c -target x86_64-scei-ps4 -fsanitize=vptr -frtti %s
>> 2>&1 | FileCheck -check-prefix=CHECK-OK %s
>> -// RUN: %clang -### -c -target x86_64-scei-ps4 -fsanitize=vptr -fno-rtti
>> %s 2>&1 | FileCheck -check-prefix=CHECK-SAN-ERROR %s
>> +// RUN: %clang -### -c -target x86_64-scei-ps4 -fsanitize=null,vptr %s
>> 2>&1 | FileCheck -check-prefix=CHECK-SAN-WARN %s
>> +// RUN: %clang -### -c -target x86_64-scei-ps4 -fsanitize=null,vptr
>> -frtti %s 2>&1 | FileCheck -check-prefix=CHECK-OK %s
>> +// RUN: %clang -### -c -target x86_64-scei-ps4 -fsanitize=null,vptr
>> -fno-rtti %s 2>&1 | FileCheck -check-prefix=CHECK-SAN-ERROR %s
>>  // RUN: %clang -### -c -target x86_64-scei-ps4 -fsanitize=undefined
>> -frtti %s 2>&1 | FileCheck -check-prefix=CHECK-OK %s
>>
>>  // Exceptions + no/default rtti
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>


More information about the cfe-commits mailing list