aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2020-12-09 16:21:18 +0100
committerMartin Liska <mliska@suse.cz>2020-12-14 10:49:27 +0100
commitab28eac607637a641fbec27c5f6bbe9b6197c80f (patch)
tree0bf15ad54b9bfbec1e28df92669cf33190fff945
parentcf7efe2d36f4f940afebae04fc342dbd3d386b9b (diff)
downloadgcc-ab28eac607637a641fbec27c5f6bbe9b6197c80f.zip
gcc-ab28eac607637a641fbec27c5f6bbe9b6197c80f.tar.gz
gcc-ab28eac607637a641fbec27c5f6bbe9b6197c80f.tar.bz2
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.
-rw-r--r--gcc/c/c-typeck.c6
-rw-r--r--gcc/testsuite/c-c++-common/asan/pr98204.c6
2 files changed, 9 insertions, 3 deletions
diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c
index 138af07..7d58e8d 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 0000000..7532646
--- /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);