aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2024-04-17 10:24:18 +0200
committerJakub Jelinek <jakub@redhat.com>2024-04-17 10:24:18 +0200
commit299d14a54672a4d12c1abbe4031a732bb56cddaa (patch)
tree1742c76995de8f51c2be15fc1e32794ef7b99c7d
parent9c7cf5d71f071655a90a6d364369d111bafdb25a (diff)
downloadgcc-299d14a54672a4d12c1abbe4031a732bb56cddaa.zip
gcc-299d14a54672a4d12c1abbe4031a732bb56cddaa.tar.gz
gcc-299d14a54672a4d12c1abbe4031a732bb56cddaa.tar.bz2
asan: Don't instrument .ABNORMAL_DISPATCHER [PR114743]
.ABNORMAL_DISPATCHER is currently the only internal function with ECF_NORETURN, and asan likes to instrument ECF_NORETURN calls by adding some builtin call before them, which breaks the .ABNORMAL_DISPATCHER discovery added in gsi_safe_*. The following patch fixes asan not to instrument .ABNORMAL_DISPATCHER calls, like it doesn't instrument a couple of specific builtin calls as well. 2024-04-17 Jakub Jelinek <jakub@redhat.com> PR sanitizer/114743 * asan.cc (maybe_instrument_call): Don't instrument calls to .ABNORMAL_DISPATCHER. * gcc.dg/asan/pr112709-2.c (freddy): New function from gcc.dg/ubsan/pr112709-2.c version of the test.
-rw-r--r--gcc/asan.cc3
-rw-r--r--gcc/testsuite/gcc.dg/asan/pr112709-2.c12
2 files changed, 15 insertions, 0 deletions
diff --git a/gcc/asan.cc b/gcc/asan.cc
index 57c3a9b..9e0f51b 100644
--- a/gcc/asan.cc
+++ b/gcc/asan.cc
@@ -3030,6 +3030,9 @@ maybe_instrument_call (gimple_stmt_iterator *iter)
break;
}
}
+ if (gimple_call_internal_p (stmt, IFN_ABNORMAL_DISPATCHER))
+ /* Don't instrument this. */
+ return false;
/* If a function does not return, then we must handle clearing up the
shadow stack accordingly. For ASAN we can simply set the entire stack
to "valid" for accesses by setting the shadow space to 0 and all
diff --git a/gcc/testsuite/gcc.dg/asan/pr112709-2.c b/gcc/testsuite/gcc.dg/asan/pr112709-2.c
index e793f53..6fa3491 100644
--- a/gcc/testsuite/gcc.dg/asan/pr112709-2.c
+++ b/gcc/testsuite/gcc.dg/asan/pr112709-2.c
@@ -48,3 +48,15 @@ l3:
if (x < 4)
goto *q[x & 3];
}
+
+void
+freddy (int x, int *y, struct S *p)
+{
+ bar (*p);
+ ++p;
+ if (x == 25)
+ x = foo (2);
+ else if (x == 42)
+ x = foo (foo (3));
+ *y = bar (*p);
+}