re PR sanitizer/67941 (calls on function pointer from a captureless lambda cause...
authorJason Merrill <jason@redhat.com>
Wed, 25 Nov 2015 18:58:11 +0000 (13:58 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 25 Nov 2015 18:58:11 +0000 (13:58 -0500)
PR c++/67941
* lambda.c (maybe_add_lambda_conv_op): Mark _FUN as
no_sanitize_undefined.

From-SVN: r230897

gcc/cp/ChangeLog
gcc/cp/lambda.c
gcc/testsuite/g++.dg/ubsan/null-6.C [new file with mode: 0644]

index 968482f3a3e3b874f4e9a0e1e5ac908c002f117e..635db4e46e927337debb192c8b81317f5445f2f6 100644 (file)
@@ -1,5 +1,9 @@
 2015-11-25  Jason Merrill  <jason@redhat.com>
 
+       PR c++/67941
+       * lambda.c (maybe_add_lambda_conv_op): Mark _FUN as
+       no_sanitize_undefined.
+
        * cp-ubsan.c (cp_ubsan_instrument_vptr_p): Use
        do_ubsan_in_current_function.
 
index 5fe34731e4fa5852a67ae7ea8ef6d13af830430f..f9b686b16e82d01c240f03ee5bfbb397f8647fa5 100644 (file)
@@ -1053,6 +1053,12 @@ maybe_add_lambda_conv_op (tree type)
   if (generic_lambda_p)
     fn = add_inherited_template_parms (fn, DECL_TI_TEMPLATE (callop));
 
+  /* Don't UBsan this function; we're deliberately calling op() with a null
+     object argument.  */
+  tree attrs = build_tree_list (get_identifier ("no_sanitize_undefined"),
+                               NULL_TREE);
+  cplus_decl_attributes (&fn, attrs, 0);
+
   add_method (type, fn, NULL_TREE);
 
   if (nested)
diff --git a/gcc/testsuite/g++.dg/ubsan/null-6.C b/gcc/testsuite/g++.dg/ubsan/null-6.C
new file mode 100644 (file)
index 0000000..2efe5c2
--- /dev/null
@@ -0,0 +1,5 @@
+// PR c++/67941
+// { dg-do run { target c++11 } }
+// { dg-options -fsanitize=null }
+
+int main(){ (+[](){})(); }