From b59e2a4903fa1ac8c3b34338a62b1e3fb15c3792 Mon Sep 17 00:00:00 2001 From: Max Ostapenko Date: Mon, 23 Nov 2015 11:15:13 +0200 Subject: [PATCH] libsanitizer merge from upstream r253555, compiler part. gcc/ * opts.c (finish_options): Allow -fsanitize-recover=address for userspace sanitization. * asan.c (asan_expand_check_ifn): Redefine recover_p. * doc/invoke.texi (fsanitize-recover): Update documentation. gcc/testsuite/ * c-c++-common/asan/halt_on_error-1.c: New test. * c-c++-common/asan/halt_on_error-2.c: Likewise. From-SVN: r230741 --- gcc/ChangeLog | 7 ++++++ gcc/asan.c | 8 ++++--- gcc/doc/invoke.texi | 6 +++-- gcc/opts.c | 5 +--- gcc/testsuite/ChangeLog | 5 ++++ .../c-c++-common/asan/halt_on_error-1.c | 23 ++++++++++++++++++ .../c-c++-common/asan/halt_on_error-2.c | 24 +++++++++++++++++++ 7 files changed, 69 insertions(+), 9 deletions(-) create mode 100644 gcc/testsuite/c-c++-common/asan/halt_on_error-1.c create mode 100644 gcc/testsuite/c-c++-common/asan/halt_on_error-2.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7b0545f33d7..16bb1aa3221 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2015-11-23 Maxim Ostapenko + + * opts.c (finish_options): Allow -fsanitize-recover=address for + userspace sanitization. + * asan.c (asan_expand_check_ifn): Redefine recover_p. + * doc/invoke.texi (fsanitize-recover): Update documentation. + 2015-11-23 Tom de Vries * omp-low.c (build_receiver_ref): Mark by_ref mem_ref as non-trapping. diff --git a/gcc/asan.c b/gcc/asan.c index 0df5e3234b5..6d9a8030fa2 100644 --- a/gcc/asan.c +++ b/gcc/asan.c @@ -2533,9 +2533,11 @@ asan_expand_check_ifn (gimple_stmt_iterator *iter, bool use_calls) { gimple *g = gsi_stmt (*iter); location_t loc = gimple_location (g); - - bool recover_p - = (flag_sanitize & flag_sanitize_recover & SANITIZE_KERNEL_ADDRESS) != 0; + bool recover_p; + if (flag_sanitize & SANITIZE_USER_ADDRESS) + recover_p = (flag_sanitize_recover & SANITIZE_USER_ADDRESS) != 0; + else + recover_p = (flag_sanitize_recover & SANITIZE_KERNEL_ADDRESS) != 0; HOST_WIDE_INT flags = tree_to_shwi (gimple_call_arg (g, 0)); gcc_assert (flags < ASAN_CHECK_LAST); diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 7cef176fdc9..53f1fe2a9a6 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -6111,8 +6111,10 @@ and program then exits with a non-zero exit code. Currently this feature only works for @option{-fsanitize=undefined} (and its suboptions except for @option{-fsanitize=unreachable} and @option{-fsanitize=return}), -@option{-fsanitize=float-cast-overflow}, @option{-fsanitize=float-divide-by-zero} and -@option{-fsanitize=kernel-address}. For these sanitizers error recovery is turned on by default. +@option{-fsanitize=float-cast-overflow}, @option{-fsanitize=float-divide-by-zero}, +@option{-fsanitize=kernel-address} and @option{-fsanitize=address}. +For these sanitizers error recovery is turned on by default, except @option{-fsanitize=address}, +for which this feature is experimental. @option{-fsanitize-recover=all} and @option{-fno-sanitize-recover=all} is also accepted, the former enables recovery for all sanitizers that support it, the latter disables recovery for all sanitizers that support it. diff --git a/gcc/opts.c b/gcc/opts.c index 4345cc886ed..874c84fec5b 100644 --- a/gcc/opts.c +++ b/gcc/opts.c @@ -941,10 +941,7 @@ finish_options (struct gcc_options *opts, struct gcc_options *opts_set, "-fsanitize=address and -fsanitize=kernel-address " "are incompatible with -fsanitize=thread"); - /* Error recovery is not allowed for ASan and TSan. */ - - if (opts->x_flag_sanitize_recover & SANITIZE_USER_ADDRESS) - error_at (loc, "-fsanitize-recover=address is not supported"); + /* Error recovery is not allowed for LSan and TSan. */ if (opts->x_flag_sanitize_recover & SANITIZE_THREAD) error_at (loc, "-fsanitize-recover=thread is not supported"); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 939520f8596..8781283f606 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-11-23 Maxim Ostapenko + + * c-c++-common/asan/halt_on_error-1.c: New test. + * c-c++-common/asan/halt_on_error-2.c: Likewise. + 2015-11-23 Richard Biener PR tree-optimization/68482 diff --git a/gcc/testsuite/c-c++-common/asan/halt_on_error-1.c b/gcc/testsuite/c-c++-common/asan/halt_on_error-1.c new file mode 100644 index 00000000000..b015e9684bf --- /dev/null +++ b/gcc/testsuite/c-c++-common/asan/halt_on_error-1.c @@ -0,0 +1,23 @@ +/* Test recovery mode. */ +/* { dg-do run } */ +/* { dg-options "-fsanitize-recover=address" } */ +/* { dg-set-target-env-var ASAN_OPTIONS "halt_on_error=false" } */ + +#include + +volatile int ten = 10; + +int main() { + char x[10]; + memset(x, 0, ten + 1); + asm volatile ("" : : : "memory"); + volatile int res = x[ten]; + x[ten] = res + 3; + res = x[ten]; + return 0; +} + +/* { dg-output "WRITE of size 11 at 0x\[0-9a-f\]+ thread T0\[^\n\r]*(\n|\r\n|\r).*" } */ +/* { dg-output "\[^\n\r]*READ of size 1 at 0x\[0-9a-f\]+ thread T0\[^\n\r]*(\n|\r\n|\r).*" } */ +/* { dg-output "\[^\n\r]*WRITE of size 1 at 0x\[0-9a-f\]+ thread T0\[^\n\r]*(\n|\r\n|\r).*" } */ +/* { dg-output "\[^\n\r]*READ of size 1 at 0x\[0-9a-f\]+ thread T0\[^\n\r]*(\n|\r\n|\r).*" } */ diff --git a/gcc/testsuite/c-c++-common/asan/halt_on_error-2.c b/gcc/testsuite/c-c++-common/asan/halt_on_error-2.c new file mode 100644 index 00000000000..4527889af14 --- /dev/null +++ b/gcc/testsuite/c-c++-common/asan/halt_on_error-2.c @@ -0,0 +1,24 @@ +/* Test recovery mode. */ +/* { dg-do run } */ +/* { dg-options "-fsanitize-recover=address" } */ +/* { dg-set-target-env-var ASAN_OPTIONS "halt_on_error=true" } */ +/* { dg-shouldfail "asan" } */ + +#include + +volatile int ten = 10; + +int main() { + char x[10]; + memset(x, 0, ten + 1); + asm volatile ("" : : : "memory"); + volatile int res = x[ten]; + x[ten] = res + 3; + res = x[ten]; + return 0; +} + +/* { dg-output "WRITE of size 11 at 0x\[0-9a-f\]+ thread T0\[^\n\r]*(\n|\r\n|\r).*" } */ +/* { dg-prune-output "\[^\n\r]*READ of size 1 at 0x\[0-9a-f\]+ thread T0\[^\n\r]*(\n|\r\n|\r).*" } */ +/* { dg-prune-output "\[^\n\r]*WRITE of size 1 at 0x\[0-9a-f\]+ thread T0\[^\n\r]*(\n|\r\n|\r).*" } */ +/* { dg-prune-output "\[^\n\r]*READ of size 1 at 0x\[0-9a-f\]+ thread T0\[^\n\r]*(\n|\r\n|\r).*" } */ -- 2.30.2