Skip to content

Commit

Permalink
[hwasan] Fix and re-enable deep-recursion.c (#69265)
Browse files Browse the repository at this point in the history
deep-recursion.c was disabled

(c007e0f)
because the test may get unlucky and end up with a zero-tagged variable,
leading to a false negative
(#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@google.com>
  • Loading branch information
thurstond and thurstond committed Oct 17, 2023
1 parent 4b8b70a commit aa4dfd3
Showing 1 changed file with 17 additions and 4 deletions.
21 changes: 17 additions & 4 deletions compiler-rt/test/hwasan/TestCases/deep-recursion.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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 different (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(); }
Expand Down

0 comments on commit aa4dfd3

Please sign in to comment.