From ab28eac607637a641fbec27c5f6bbe9b6197c80f Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Wed, 9 Dec 2020 16:21:18 +0100 Subject: [PATCH] sanitizer: do not ICE for pointer cmp/sub gcc/c/ChangeLog: PR sanitizer/98204 * c-typeck.c (pointer_diff): Do not emit a top-level sanitization. (build_binary_op): Likewise. gcc/testsuite/ChangeLog: PR sanitizer/98204 * c-c++-common/asan/pr98204.c: New test. --- gcc/c/c-typeck.c | 6 +++--- gcc/testsuite/c-c++-common/asan/pr98204.c | 6 ++++++ 2 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/c-c++-common/asan/pr98204.c diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c index 138af0739255..7d58e8de342b 100644 --- a/gcc/c/c-typeck.c +++ b/gcc/c/c-typeck.c @@ -3949,10 +3949,9 @@ pointer_diff (location_t loc, tree op0, tree op1, tree *instrument_expr) pedwarn (loc, OPT_Wpointer_arith, "pointer to a function used in subtraction"); - if (sanitize_flags_p (SANITIZE_POINTER_SUBTRACT)) + if (current_function_decl != NULL_TREE + && sanitize_flags_p (SANITIZE_POINTER_SUBTRACT)) { - gcc_assert (current_function_decl != NULL_TREE); - op0 = save_expr (op0); op1 = save_expr (op1); @@ -12324,6 +12323,7 @@ build_binary_op (location_t location, enum tree_code code, } if ((code0 == POINTER_TYPE || code1 == POINTER_TYPE) + && current_function_decl != NULL_TREE && sanitize_flags_p (SANITIZE_POINTER_COMPARE)) { op0 = save_expr (op0); diff --git a/gcc/testsuite/c-c++-common/asan/pr98204.c b/gcc/testsuite/c-c++-common/asan/pr98204.c new file mode 100644 index 000000000000..7532646d7124 --- /dev/null +++ b/gcc/testsuite/c-c++-common/asan/pr98204.c @@ -0,0 +1,6 @@ +/* PR sanitizer/98204 */ +/* { dg-options "-fsanitize=address,pointer-subtract,pointer-compare" } */ + +struct{int c;}v; +static long i=((char*)&(v.c)-(char*)&v); +static long i2=((char*)&(v.c)<(char*)&v); -- 2.47.2