diff mbox series

c++: Ignore __sanitizer_ptr_{sub,cmp} builtin calls during constant expression evaluation [PR97145]

Message ID 20200922074801.GW2176@tucnak
State New
Headers show
Series c++: Ignore __sanitizer_ptr_{sub,cmp} builtin calls during constant expression evaluation [PR97145] | expand

Commit Message

Jakub Jelinek Sept. 22, 2020, 7:48 a.m. UTC
Hi!

These two builtin calls are added already during parsing before pointer
subtractions or comparisons, normally they perform runtime verification
of whether the pointers point to the same object or different objects,
but during constant expressione valuation we don't really need those
builtins for anything.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2020-09-22  Jakub Jelinek  <jakub@redhat.com>

	PR c++/97145
	* constexpr.c (cxx_eval_builtin_function_call): Return void_node for
	calls to __sanitize_ptr_{sub,cmp} builtins.

	* g++.dg/asan/pr97145.C: New test.


	Jakub

Comments

Jason Merrill Sept. 22, 2020, 1:44 p.m. UTC | #1
On 9/22/20 3:48 AM, Jakub Jelinek wrote:
> Hi!
> 
> These two builtin calls are added already during parsing before pointer
> subtractions or comparisons, normally they perform runtime verification
> of whether the pointers point to the same object or different objects,
> but during constant expressione valuation we don't really need those
> builtins for anything.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

OK.

> 2020-09-22  Jakub Jelinek  <jakub@redhat.com>
> 
> 	PR c++/97145
> 	* constexpr.c (cxx_eval_builtin_function_call): Return void_node for
> 	calls to __sanitize_ptr_{sub,cmp} builtins.
> 
> 	* g++.dg/asan/pr97145.C: New test.
> 
> --- gcc/cp/constexpr.c.jj	2020-09-07 16:58:53.342195330 +0200
> +++ gcc/cp/constexpr.c	2020-09-21 23:50:39.909211245 +0200
> @@ -1355,6 +1355,12 @@ cxx_eval_builtin_function_call (const co
>         case BUILT_IN_STRSTR:
>   	strops = 2;
>   	strret = 1;
> +	break;
> +      case BUILT_IN_ASAN_POINTER_COMPARE:
> +      case BUILT_IN_ASAN_POINTER_SUBTRACT:
> +	/* These builtins shall be ignored during constant expression
> +	   evaluation.  */
> +	return void_node;
>         default:
>   	break;
>         }
> --- gcc/testsuite/g++.dg/asan/pr97145.C.jj	2020-09-21 17:37:50.408562876 +0200
> +++ gcc/testsuite/g++.dg/asan/pr97145.C	2020-09-21 17:38:26.961031023 +0200
> @@ -0,0 +1,7 @@
> +// PR c++/97145
> +// { dg-do compile { target c++11 } }
> +// { dg-options "-fsanitize=address,pointer-subtract,pointer-compare" }
> +
> +constexpr char *a = nullptr;
> +constexpr auto b = a - a;
> +constexpr auto c = a < a;
> 
> 	Jakub
>
diff mbox series

Patch

--- gcc/cp/constexpr.c.jj	2020-09-07 16:58:53.342195330 +0200
+++ gcc/cp/constexpr.c	2020-09-21 23:50:39.909211245 +0200
@@ -1355,6 +1355,12 @@  cxx_eval_builtin_function_call (const co
       case BUILT_IN_STRSTR:
 	strops = 2;
 	strret = 1;
+	break;
+      case BUILT_IN_ASAN_POINTER_COMPARE:
+      case BUILT_IN_ASAN_POINTER_SUBTRACT:
+	/* These builtins shall be ignored during constant expression
+	   evaluation.  */
+	return void_node;
       default:
 	break;
       }
--- gcc/testsuite/g++.dg/asan/pr97145.C.jj	2020-09-21 17:37:50.408562876 +0200
+++ gcc/testsuite/g++.dg/asan/pr97145.C	2020-09-21 17:38:26.961031023 +0200
@@ -0,0 +1,7 @@ 
+// PR c++/97145
+// { dg-do compile { target c++11 } }
+// { dg-options "-fsanitize=address,pointer-subtract,pointer-compare" }
+
+constexpr char *a = nullptr;
+constexpr auto b = a - a;
+constexpr auto c = a < a;