On 16 Feb 17:01, Jakub Jelinek wrote: > 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
OK. With no tricky memory references this should be safe. Here is a patch to filter off Adress Sanitizer only. Thanks for review! Ilya -- gcc/ 2015-02-16 Ilya Enkovich <ilya.enkov...@intel.com> PR target/65044 * toplev.c (process_options): Restrict Pointer Bounds Checker usage with Address Sanitizer. gcc/testsuite/ 2015-02-16 Ilya Enkovich <ilya.enkov...@intel.com> PR target/65044 * gcc.target/i386/pr65044.c: New. diff --git a/gcc/testsuite/gcc.target/i386/pr65044.c b/gcc/testsuite/gcc.target/i386/pr65044.c new file mode 100644 index 0000000..4f318d6 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr65044.c @@ -0,0 +1,12 @@ +/* { dg-error "-fcheck-pointer-bounds is not supported with Address Sanitizer" } */ +/* { 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..70eb6b6 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -1376,6 +1376,11 @@ process_options (void) { if (targetm.chkp_bound_mode () == VOIDmode) error ("-fcheck-pointer-bounds is not supported for this target"); + + if (flag_sanitize & SANITIZE_ADDRESS) + error ("-fcheck-pointer-bounds is not supported with Address Sanitizer"); + + flag_check_pointer_bounds = 0; } /* One region RA really helps to decrease the code size. */