[PATCH] D36096: [ubsan] Make the 'vptr check disabled' warning more helpful

Vedant Kumar via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon Jul 31 11:26:54 PDT 2017


vsk created this revision.

If -fsanitize=vptr is passed without -fsanitize=null being specified, it will say:

  warning: implicitly disabling vptr sanitizer because null checking wasn't enabled (try specifying -fsanitize=null or -fsanitize=undefined)

Otherwise if the vptr check is enabled and null checking is explicitly disabled, it will say:

warning: implicitly disabling vptr sanitizer because null checking wasn't enabled (try removing -fno-sanitize=null)

See the mailing list thread re: r309007


https://reviews.llvm.org/D36096

Files:
  include/clang/Basic/DiagnosticDriverKinds.td
  lib/Driver/SanitizerArgs.cpp
  test/Driver/fsanitize.c


Index: test/Driver/fsanitize.c
===================================================================
--- test/Driver/fsanitize.c
+++ test/Driver/fsanitize.c
@@ -58,9 +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=undefined -fno-sanitize=null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-VPTR-EXPLICIT-NO-NULL
+// CHECK-VPTR-EXPLICIT-NO-NULL: warning: implicitly disabling vptr sanitizer because null checking wasn't enabled (try removing -fno-sanitize=null)
+// RUN: %clang -target x86_64-linux-gnu -fsanitize=vptr %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-VPTR-IMPLICIT-NO-NULL
+// CHECK-VPTR-IMPLICIT-NO-NULL: warning: implicitly disabling vptr sanitizer because null checking wasn't enabled (try specifying -fsanitize=null or -fsanitize=undefined)
 
 // 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'
Index: lib/Driver/SanitizerArgs.cpp
===================================================================
--- lib/Driver/SanitizerArgs.cpp
+++ lib/Driver/SanitizerArgs.cpp
@@ -311,7 +311,7 @@
   // 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);
+    D.Diag(diag::warn_drv_disabling_vptr_no_null_check) << !!(AllRemove & Null);
   }
 
   // Check that LTO is enabled if we need it.
Index: include/clang/Basic/DiagnosticDriverKinds.td
===================================================================
--- include/clang/Basic/DiagnosticDriverKinds.td
+++ include/clang/Basic/DiagnosticDriverKinds.td
@@ -232,7 +232,7 @@
   "implicitly disabling vptr sanitizer because rtti wasn't enabled">,
   InGroup<AutoDisableVptrSanitizer>;
 def warn_drv_disabling_vptr_no_null_check : Warning<
-  "implicitly disabling vptr sanitizer because null checking wasn't enabled">,
+  "implicitly disabling vptr sanitizer because null checking wasn't enabled (try %select{specifying -fsanitize=null or -fsanitize=undefined|removing -fno-sanitize=null}0)">,
   InGroup<AutoDisableVptrSanitizer>;
 def warn_drv_object_size_disabled_O0 : Warning<
   "the object size sanitizer has no effect at -O0, but is explicitly enabled: %0">,


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D36096.108955.patch
Type: text/x-patch
Size: 2879 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170731/c1b05a34/attachment.bin>


More information about the cfe-commits mailing list