diff mbox

[CHKP,PR,target/65044] Restrict pointer bounds checker with Sanitizer

Message ID 20150216152059.GA51560@msticlxl57.ims.intel.com
State New
Headers show

Commit Message

Ilya Enkovich Feb. 16, 2015, 3:20 p.m. UTC
Hi,

This patch restricts usage of Pointer Bounds Checker with Sanitizer.  OK for trunk?

Thanks,
Ilya
--
gcc/

2015-02-16  Ilya Enkovich  <ilya.enkovich@intel.com>

	PR target/65044
	* toplev.c (process_options): Restrict Pointer Bounds Checker
	usage with sanitizers.

gcc/testsuite/

2015-02-16  Ilya Enkovich  <ilya.enkovich@intel.com>

	PR target/65044
	* gcc.target/i386/pr65044.c: New.

Comments

Jakub Jelinek Feb. 16, 2015, 3:31 p.m. UTC | #1
On Mon, Feb 16, 2015 at 06:20:59PM +0300, Ilya Enkovich wrote:
> This patch restricts usage of Pointer Bounds Checker with Sanitizer.  OK for trunk?

There are many sanitizers, and for most of them I don't see why they would
be in any conflict with -mmpx, it is just -fsanitize=address and
-fsanitize=kernel-address.
So perhaps test instead if (flag_sanitize & SANITIZE_ADDRESS) != 0, and
better clear the flag_pointer_bounds after issuing the error, error () is
not a fatal function, so you need something sensible for error-recovery.

	Jakub
Ilya Enkovich Feb. 16, 2015, 3:56 p.m. UTC | #2
On 16 Feb 16:31, Jakub Jelinek wrote:
> On Mon, Feb 16, 2015 at 06:20:59PM +0300, Ilya Enkovich wrote:
> > This patch restricts usage of Pointer Bounds Checker with Sanitizer.  OK for trunk?
> 
> There are many sanitizers, and for most of them I don't see why they would
> be in any conflict with -mmpx, it is just -fsanitize=address and
> -fsanitize=kernel-address.
> So perhaps test instead if (flag_sanitize & SANITIZE_ADDRESS) != 0, and
> better clear the flag_pointer_bounds after issuing the error, error () is
> not a fatal function, so you need something sensible for error-recovery.
> 
> 	Jakub

I don't know all sanitizers in details.  Code generated by some of them may be incorrect from checker point of view.  Thus I just wanted to disable unexplored and untested combinations.

Ilya
Jakub Jelinek Feb. 16, 2015, 4:01 p.m. UTC | #3
On Mon, Feb 16, 2015 at 06:56:45PM +0300, Ilya Enkovich wrote:
> On 16 Feb 16:31, Jakub Jelinek wrote:
> > On Mon, Feb 16, 2015 at 06:20:59PM +0300, Ilya Enkovich wrote:
> > > This patch restricts usage of Pointer Bounds Checker with Sanitizer.  OK for trunk?
> > 
> > There are many sanitizers, and for most of them I don't see why they would
> > be in any conflict with -mmpx, it is just -fsanitize=address and
> > -fsanitize=kernel-address.
> > So perhaps test instead if (flag_sanitize & SANITIZE_ADDRESS) != 0, and
> > better clear the flag_pointer_bounds after issuing the error, error () is
> > not a fatal function, so you need something sensible for error-recovery.
> > 
> > 	Jakub
> 
> I don't know all sanitizers in details.  Code generated by some of them may be incorrect from checker point of view.  Thus I just wanted to disable unexplored and untested combinations.

Shouldn't be that hard to write a testcase and test it.

Most of the sanitizers just add code like
if (some_condition)
  __ubsan_handle_... ();
where from the POV of the program the __ubsan_* function reports or might
report some problem, and optionally abort the program.
That some_condition can be a check of the pointer value, shift count,
divisor check, etc.

	Jakub
diff mbox

Patch

diff --git a/gcc/testsuite/gcc.target/i386/pr65044.c b/gcc/testsuite/gcc.target/i386/pr65044.c
new file mode 100644
index 0000000..79ecb04
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr65044.c
@@ -0,0 +1,12 @@ 
+/* { dg-error "-fcheck-pointer-bounds is not supported with sanitizers" } */
+/* { dg-do compile } */
+/* { dg-require-effective-target mpx } */
+/* { dg-options "-fcheck-pointer-bounds -mmpx -fsanitize=address" } */
+
+extern int x[];
+
+void
+foo ()
+{
+  x[0] = 0;
+}
diff --git a/gcc/toplev.c b/gcc/toplev.c
index 99cf180..bf987c8 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -1376,6 +1376,9 @@  process_options (void)
     {
       if (targetm.chkp_bound_mode () == VOIDmode)
 	error ("-fcheck-pointer-bounds is not supported for this target");
+
+      if (flag_sanitize)
+	error ("-fcheck-pointer-bounds is not supported with sanitizers");
     }
 
   /* One region RA really helps to decrease the code size.  */