From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13473 invoked by alias); 5 Feb 2018 10:52:33 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 13464 invoked by uid 89); 5 Feb 2018 10:52:32 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,SPF_PASS autolearn=ham version=3.3.2 spammy=UD:pointer-compare-1.c, 1349 X-HELO: mx2.suse.de Received: from mx2.suse.de (HELO mx2.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 05 Feb 2018 10:52:30 +0000 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 6E2D1ACB8; Mon, 5 Feb 2018 10:52:28 +0000 (UTC) From: =?UTF-8?Q?Martin_Li=c5=a1ka?= Subject: [PATCH] Cherry-pick libsanitizer pointer-pair tristate option. To: gcc-patches@gcc.gnu.org Cc: Jakub Jelinek Message-ID: <8c02a6d7-5572-9adb-aff1-3fd85ccc6d6d@suse.cz> Date: Mon, 05 Feb 2018 10:52:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------C2B49E8489BD6D660FF0EE80" X-IsSubscribed: yes X-SW-Source: 2018-02/txt/msg00168.txt.bz2 This is a multi-part message in MIME format. --------------C2B49E8489BD6D660FF0EE80 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Content-length: 1758 Hi. This is upstream backport of libsanitizer which makes detect-invalid-pointer-pair a tristate option. Patch is preapproved by Jakub. Patch can bootstrap on ppc64le-redhat-linux and survives regression tests. Martin gcc/ChangeLog: 2018-02-05 Martin Liska * doc/invoke.texi: Cherry-pick upstream r323995. gcc/testsuite/ChangeLog: 2018-02-05 Martin Liska * c-c++-common/asan/pointer-compare-1.c: Adjust ASAN_OPTIONS options. * c-c++-common/asan/pointer-compare-2.c: Likewise. * c-c++-common/asan/pointer-subtract-1.c: Likewise. * c-c++-common/asan/pointer-subtract-2.c: Likewise. * c-c++-common/asan/pointer-subtract-3.c: Likewise. * c-c++-common/asan/pointer-subtract-4.c: Likewise. * c-c++-common/asan/pointer-compare-3.c: New test. libsanitizer/ChangeLog: 2018-02-05 Martin Liska * asan/asan_flags.inc: Cherry-pick upstream r323995. * asan/asan_report.cc (CheckForInvalidPointerPair): Cherry-pick upstream r323995. --- gcc/doc/invoke.texi | 10 +++--- .../c-c++-common/asan/pointer-compare-1.c | 2 +- .../c-c++-common/asan/pointer-compare-2.c | 2 +- .../c-c++-common/asan/pointer-compare-3.c | 39 ++++++++++++++++++++++ .../c-c++-common/asan/pointer-subtract-1.c | 2 +- .../c-c++-common/asan/pointer-subtract-2.c | 2 +- .../c-c++-common/asan/pointer-subtract-3.c | 2 +- .../c-c++-common/asan/pointer-subtract-4.c | 2 +- libsanitizer/asan/asan_flags.inc | 6 ++-- libsanitizer/asan/asan_report.cc | 6 +++- 10 files changed, 59 insertions(+), 14 deletions(-) create mode 100644 gcc/testsuite/c-c++-common/asan/pointer-compare-3.c --------------C2B49E8489BD6D660FF0EE80 Content-Type: text/x-patch; name="0001-Cherry-pick-libsanitizer-pointer-pair-tristate-optio.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="0001-Cherry-pick-libsanitizer-pointer-pair-tristate-optio.pa"; filename*1="tch" Content-length: 7616 diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index f3d93367640..cf6d3ae5b99 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -11165,8 +11165,9 @@ The option must be combined with either @option{-fsanitize=kernel-address} or The option cannot be combined with @option{-fsanitize=thread} and/or @option{-fcheck-pointer-bounds}. Note: By default the check is disabled at run time. To enable it, -add @code{detect_invalid_pointer_pairs=1} to the environment variable -@env{ASAN_OPTIONS}. +add @code{detect_invalid_pointer_pairs=2} to the environment variable +@env{ASAN_OPTIONS}. Using @code{detect_invalid_pointer_pairs=1} detects +invalid operation only when both pointers are non-null. @item -fsanitize=pointer-subtract @opindex fsanitize=pointer-subtract @@ -11176,8 +11177,9 @@ The option must be combined with either @option{-fsanitize=kernel-address} or The option cannot be combined with @option{-fsanitize=thread} and/or @option{-fcheck-pointer-bounds}. Note: By default the check is disabled at run time. To enable it, -add @code{detect_invalid_pointer_pairs=1} to the environment variable -@env{ASAN_OPTIONS}. +add @code{detect_invalid_pointer_pairs=2} to the environment variable +@env{ASAN_OPTIONS}. Using @code{detect_invalid_pointer_pairs=1} detects +invalid operation only when both pointers are non-null. @item -fsanitize=thread @opindex fsanitize=thread diff --git a/gcc/testsuite/c-c++-common/asan/pointer-compare-1.c b/gcc/testsuite/c-c++-common/asan/pointer-compare-1.c index 2cc7395241a..cf67fe98bee 100644 --- a/gcc/testsuite/c-c++-common/asan/pointer-compare-1.c +++ b/gcc/testsuite/c-c++-common/asan/pointer-compare-1.c @@ -1,5 +1,5 @@ /* { dg-do run } */ -/* { dg-set-target-env-var ASAN_OPTIONS "detect_invalid_pointer_pairs=1:halt_on_error=0" } */ +/* { dg-set-target-env-var ASAN_OPTIONS "detect_invalid_pointer_pairs=2:halt_on_error=0" } */ /* { dg-options "-fsanitize=address,pointer-compare" } */ volatile int v; diff --git a/gcc/testsuite/c-c++-common/asan/pointer-compare-2.c b/gcc/testsuite/c-c++-common/asan/pointer-compare-2.c index 5539087e856..d2142c8f160 100644 --- a/gcc/testsuite/c-c++-common/asan/pointer-compare-2.c +++ b/gcc/testsuite/c-c++-common/asan/pointer-compare-2.c @@ -1,5 +1,5 @@ /* { dg-do run } */ -/* { dg-set-target-env-var ASAN_OPTIONS "detect_invalid_pointer_pairs=1 halt_on_error=1" } */ +/* { dg-set-target-env-var ASAN_OPTIONS "detect_invalid_pointer_pairs=2 halt_on_error=1" } */ /* { dg-options "-fsanitize=address,pointer-compare" } */ volatile int v; diff --git a/gcc/testsuite/c-c++-common/asan/pointer-compare-3.c b/gcc/testsuite/c-c++-common/asan/pointer-compare-3.c new file mode 100644 index 00000000000..7156e494aeb --- /dev/null +++ b/gcc/testsuite/c-c++-common/asan/pointer-compare-3.c @@ -0,0 +1,39 @@ +/* { dg-do run } */ +/* { dg-set-target-env-var ASAN_OPTIONS "detect_invalid_pointer_pairs=1:halt_on_error=1" } */ +/* { dg-options "-fsanitize=address,pointer-compare" } */ + +int foo(char *p, char *q) { + return p <= q; +} + +char global[8192] = {}; +char small_global[7] = {}; + +int main() { + // Heap allocated memory. + char *p = (char *)__builtin_malloc(42); + int r = foo(p, 0); + __builtin_free(p); + + p = (char *)__builtin_malloc(1024); + foo(0, p); + __builtin_free(p); + + p = (char *)__builtin_malloc(4096); + foo(p, 0); + __builtin_free(p); + + // Global variable. + foo(&global[0], 0); + foo(&global[1000], 0); + + p = &small_global[0]; + foo(p, 0); + + // Stack variable. + char stack[10000]; + foo(&stack[0], 0); + foo(0, &stack[9000]); + + return 0; +} diff --git a/gcc/testsuite/c-c++-common/asan/pointer-subtract-1.c b/gcc/testsuite/c-c++-common/asan/pointer-subtract-1.c index 7cbef811d7b..091a33f167d 100644 --- a/gcc/testsuite/c-c++-common/asan/pointer-subtract-1.c +++ b/gcc/testsuite/c-c++-common/asan/pointer-subtract-1.c @@ -1,5 +1,5 @@ /* { dg-do run } */ -/* { dg-set-target-env-var ASAN_OPTIONS "detect_invalid_pointer_pairs=1 halt_on_error=0" } */ +/* { dg-set-target-env-var ASAN_OPTIONS "detect_invalid_pointer_pairs=2 halt_on_error=0" } */ /* { dg-options "-fsanitize=address,pointer-subtract" } */ volatile __PTRDIFF_TYPE__ v; diff --git a/gcc/testsuite/c-c++-common/asan/pointer-subtract-2.c b/gcc/testsuite/c-c++-common/asan/pointer-subtract-2.c index 6b65a16b559..7ef106c03ce 100644 --- a/gcc/testsuite/c-c++-common/asan/pointer-subtract-2.c +++ b/gcc/testsuite/c-c++-common/asan/pointer-subtract-2.c @@ -1,5 +1,5 @@ /* { dg-do run } */ -/* { dg-set-target-env-var ASAN_OPTIONS "detect_invalid_pointer_pairs=1 halt_on_error=1" } */ +/* { dg-set-target-env-var ASAN_OPTIONS "detect_invalid_pointer_pairs=2 halt_on_error=1" } */ /* { dg-options "-fsanitize=address,pointer-subtract" } */ volatile __PTRDIFF_TYPE__ v; diff --git a/gcc/testsuite/c-c++-common/asan/pointer-subtract-3.c b/gcc/testsuite/c-c++-common/asan/pointer-subtract-3.c index 5cbcda92503..7cae91b6991 100644 --- a/gcc/testsuite/c-c++-common/asan/pointer-subtract-3.c +++ b/gcc/testsuite/c-c++-common/asan/pointer-subtract-3.c @@ -1,5 +1,5 @@ /* { dg-do run { target pthread_h } } */ -/* { dg-set-target-env-var ASAN_OPTIONS "detect_invalid_pointer_pairs=1:halt_on_error=1" } */ +/* { dg-set-target-env-var ASAN_OPTIONS "detect_invalid_pointer_pairs=2:halt_on_error=1" } */ /* { dg-options "-fsanitize=address,pointer-subtract" } */ /* { dg-additional-options "-pthread" { target pthread } } */ diff --git a/gcc/testsuite/c-c++-common/asan/pointer-subtract-4.c b/gcc/testsuite/c-c++-common/asan/pointer-subtract-4.c index 820f0aa64b0..af65c59512b 100644 --- a/gcc/testsuite/c-c++-common/asan/pointer-subtract-4.c +++ b/gcc/testsuite/c-c++-common/asan/pointer-subtract-4.c @@ -1,6 +1,6 @@ /* { dg-do run { target pthread_h } } */ /* { dg-shouldfail "asan" } */ -/* { dg-set-target-env-var ASAN_OPTIONS "detect_invalid_pointer_pairs=1:halt_on_error=1" } */ +/* { dg-set-target-env-var ASAN_OPTIONS "detect_invalid_pointer_pairs=2:halt_on_error=1" } */ /* { dg-options "-fsanitize=address,pointer-subtract" } */ /* { dg-additional-options "-pthread" { target pthread } } */ diff --git a/libsanitizer/asan/asan_flags.inc b/libsanitizer/asan/asan_flags.inc index 3784f065be6..b4253e02524 100644 --- a/libsanitizer/asan/asan_flags.inc +++ b/libsanitizer/asan/asan_flags.inc @@ -134,9 +134,9 @@ ASAN_FLAG( "Android. ") ASAN_FLAG( int, detect_invalid_pointer_pairs, 0, - "If non-zero, try to detect operations like <, <=, >, >= and - on " - "invalid pointer pairs (e.g. when pointers belong to different objects). " - "The bigger the value the harder we try.") + "If >= 2, detect operations like <, <=, >, >= and - on invalid pointer " + "pairs (e.g. when pointers belong to different objects); " + "If == 1, detect invalid operations only when both pointers are non-null.") ASAN_FLAG( bool, detect_container_overflow, true, "If true, honor the container overflow annotations. See " diff --git a/libsanitizer/asan/asan_report.cc b/libsanitizer/asan/asan_report.cc index 261ec1aece5..434aa734c8f 100644 --- a/libsanitizer/asan/asan_report.cc +++ b/libsanitizer/asan/asan_report.cc @@ -340,7 +340,11 @@ static bool IsInvalidPointerPair(uptr a1, uptr a2) { } static INLINE void CheckForInvalidPointerPair(void *p1, void *p2) { - if (!flags()->detect_invalid_pointer_pairs) return; + switch (flags()->detect_invalid_pointer_pairs) { + case 0 : return; + case 1 : if (p1 == nullptr || p2 == nullptr) return; break; + } + uptr a1 = reinterpret_cast(p1); uptr a2 = reinterpret_cast(p2); --------------C2B49E8489BD6D660FF0EE80--