/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@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@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@lists.llvm.org >> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits > > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits > _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits