[compiler-rt] aa4dfd3 - [hwasan] Fix and re-enable deep-recursion.c (#69265)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 16 22:46:32 PDT 2023
Author: Thurston Dang
Date: 2023-10-16T22:46:27-07:00
New Revision: aa4dfd3736dd1c2e0263eacd09bd613c5784ea73
URL: https://github.com/llvm/llvm-project/commit/aa4dfd3736dd1c2e0263eacd09bd613c5784ea73
DIFF: https://github.com/llvm/llvm-project/commit/aa4dfd3736dd1c2e0263eacd09bd613c5784ea73.diff
LOG: [hwasan] Fix and re-enable deep-recursion.c (#69265)
deep-recursion.c was disabled
(https://github.com/llvm/llvm-project/commit/c007e0f66ee3f96467fd12f6200218fb4c38c2c9)
because the test may get unlucky and end up with a zero-tagged variable,
leading to a false negative
(https://github.com/llvm/llvm-project/issues/69221).
This patch re-enables the test and adds a workaround: it checks
if the variable is zero-tagged, and if so, it will instead use the
neighboring variable, which must have a different (hence non-zero)
tag.
Fixing the stack allocation tagging is left as an exercise for the
reader. It is non-trivial because, even if the stackTagBase is
non-zero, tags for subsequent allocations in the stack frame may wrap
around to zero; working around this would require adding multiple
instructions to each alloca.
---------
Co-authored-by: Thurston Dang <thurston at google.com>
Added:
Modified:
compiler-rt/test/hwasan/TestCases/deep-recursion.c
Removed:
################################################################################
diff --git a/compiler-rt/test/hwasan/TestCases/deep-recursion.c b/compiler-rt/test/hwasan/TestCases/deep-recursion.c
index bf390d051d472e7..792f758958270b6 100644
--- a/compiler-rt/test/hwasan/TestCases/deep-recursion.c
+++ b/compiler-rt/test/hwasan/TestCases/deep-recursion.c
@@ -17,9 +17,6 @@
// Stack histories are currently not recorded on x86.
// XFAIL: target=x86_64{{.*}}
-// Flaky on AArch64 Linux, see https://github.com/llvm/llvm-project/issues/69221.
-// UNSUPPORTED: target=aarch64{{.*}}
-
#include <stdlib.h>
// At least -O1 is needed for this function to not have a stack frame on
// AArch64.
@@ -29,7 +26,23 @@ void USE(void *x) { // pretend_to_do_something(void *x)
volatile int four = 4;
-__attribute__((noinline)) void OOB() { int x[4]; x[four] = 0; USE(&x[0]); }
+__attribute__((noinline)) void OOB() {
+ int x[4];
+ int y[4];
+
+ // Tags for stack-allocated variables can occasionally be zero, resulting in
+ // a false negative for this test. This is not easy to fix, hence we work
+ // around it: if the tag is zero, we use the neighboring variable instead,
+ // which must have a
diff erent (hence non-zero) tag.
+ // This tag check assumes aarch64.
+ if (((uintptr_t)&x) >> 56 == 0) {
+ y[four] = 0;
+ } else {
+ x[four] = 0;
+ }
+ USE(&x[0]);
+ USE(&y[0]);
+}
__attribute__((noinline)) void FUNC1() { int x; USE(&x); OOB(); }
__attribute__((noinline)) void FUNC2() { int x; USE(&x); FUNC1(); }
__attribute__((noinline)) void FUNC3() { int x; USE(&x); FUNC2(); }
More information about the llvm-commits
mailing list