// REQUIRES: cxxabi
+// These checks are unsupported on newer versions of Android due to the
+// following patch that makes it harder to defeat ASLR by not mapping unused
+// shadow regions:
+// https://android-review.googlesource.com/c/platform/bionic/+/1333960
+// UNSUPPORTED: android
+
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
std::string path = std::string(argv[0]) + "-so.so";
+ // Clear any previous errors. On Android, the dynamic loader can have some
+ // left over dlerror() messages due to a missing symbol resolution for a
+ // deprecated malloc function.
+ dlerror();
+
void *handle = dlopen(path.c_str(), RTLD_LAZY);
assert(handle != 0);
typedef void **(* store_t)(void *p);
// Sometimes dlerror() occurs when we broke the interceptors.
// Add the message here to make the error more obvious.
const char *dlerror_msg = dlerror();
- assert(dlerror_msg == nullptr);
if (dlerror_msg != nullptr) {
fprintf(stderr, "DLERROR: %s\n", dlerror_msg);
fflush(stderr);
+ abort();
}
void *p = malloc(1337);
// If we don't know about dynamic TLS, we will return a false leak above.
// Test that out-of-scope local variables are ignored by LSan.
// RUN: LSAN_BASE="report_objects=1:use_registers=0:use_stacks=1"
-// RUN: %clangxx_lsan %s -o %t
+
+// LSan-in-ASan fails at -O0 on aarch64, because the stack use-after-return
+// instrumentation stashes the argument to `PutPointerOnStaleStack` on the stack
+// in order to conditionally call __asan_stack_malloc. This subverts our
+// expectations for this test, where we assume the pointer is never stashed
+// except at the bottom of the dead frame. Building at -O1 or greater solves
+// this problem, because the compiler is smart enough to stash the argument in a
+// callee-saved register for rematerialization instead.
+// RUN: %clangxx_lsan -O1 %s -o %t
+
// RUN: %env_lsan_opts=$LSAN_BASE not %run %t 2>&1 | FileCheck %s
// RUN: %env_lsan_opts=$LSAN_BASE":exitcode=0" %run %t 2>&1 | FileCheck --check-prefix=CHECK-sanity %s
//