summaryrefslogtreecommitdiff
path: root/test/asan/TestCases/Posix/start-deactivated.cc
diff options
context:
space:
mode:
Diffstat (limited to 'test/asan/TestCases/Posix/start-deactivated.cc')
-rw-r--r--test/asan/TestCases/Posix/start-deactivated.cc37
1 files changed, 32 insertions, 5 deletions
diff --git a/test/asan/TestCases/Posix/start-deactivated.cc b/test/asan/TestCases/Posix/start-deactivated.cc
index 9691404ebcea9..b223f04e46a9c 100644
--- a/test/asan/TestCases/Posix/start-deactivated.cc
+++ b/test/asan/TestCases/Posix/start-deactivated.cc
@@ -21,6 +21,7 @@
// XFAIL: arm-linux-gnueabi
#if !defined(SHARED_LIB)
+
#include <assert.h>
#include <dlfcn.h>
#include <stdio.h>
@@ -32,13 +33,13 @@
#include "sanitizer/asan_interface.h"
-constexpr unsigned nPtrs = 200;
-char *ptrs[nPtrs];
-
void test_malloc_shadow(char *p, size_t sz, bool expect_redzones) {
+ // Last byte of the left redzone, if present.
assert((char *)__asan_region_is_poisoned(p - 1, sz + 1) ==
(expect_redzones ? p - 1 : nullptr));
+ // The user memory.
assert((char *)__asan_region_is_poisoned(p, sz) == nullptr);
+ // First byte of the right redzone, if present.
assert((char *)__asan_region_is_poisoned(p, sz + 1) ==
(expect_redzones ? p + sz : nullptr));
}
@@ -46,12 +47,29 @@ void test_malloc_shadow(char *p, size_t sz, bool expect_redzones) {
typedef void (*Fn)();
int main(int argc, char *argv[]) {
+ constexpr unsigned nPtrs = 200;
+ char *ptrs[nPtrs];
+
// Before activation: no redzones.
for (size_t sz = 1; sz < nPtrs; ++sz) {
ptrs[sz] = (char *)malloc(sz);
test_malloc_shadow(ptrs[sz], sz, false);
}
+ // Create a honey pot for the future, instrumented, allocations. Since the
+ // quarantine is disabled, chunks are going to be recycled right away and
+ // reused for the new allocations. New allocations must get the proper
+ // redzones anyway, whether it's a fresh or reused allocation.
+ constexpr size_t HoneyPotBlockSize = 4096;
+ constexpr int HoneyPotSize = 200;
+ char *honeyPot[HoneyPotSize];
+ for (int i = 1; i < HoneyPotSize; ++i) {
+ honeyPot[i] = (char *)malloc(HoneyPotBlockSize);
+ test_malloc_shadow(honeyPot[i], HoneyPotBlockSize, false);
+ }
+ for (int i = 1; i < HoneyPotSize; ++i)
+ free(honeyPot[i]);
+
std::string path = std::string(argv[0]) + "-so.so";
void *dso = dlopen(path.c_str(), RTLD_NOW);
if (!dso) {
@@ -67,11 +85,17 @@ int main(int argc, char *argv[]) {
}
// After activation: redzones.
+ for (int i = 1; i < HoneyPotSize; ++i) {
+ honeyPot[i] = (char *)malloc(HoneyPotBlockSize);
+ test_malloc_shadow(honeyPot[i], HoneyPotBlockSize, true);
+ }
{
- char *p = (char *)malloc(100);
- test_malloc_shadow(p, 100, true);
+ char *p = (char *)malloc(HoneyPotBlockSize);
+ test_malloc_shadow(p, HoneyPotBlockSize, true);
free(p);
}
+ for (int i = 1; i < HoneyPotSize; ++i)
+ free(honeyPot[i]);
// Pre-existing allocations got redzones, too.
for (size_t sz = 1; sz < nPtrs; ++sz) {
@@ -93,7 +117,9 @@ int main(int argc, char *argv[]) {
return 0;
}
+
#else // SHARED_LIB
+
#include <stdio.h>
#include <stdlib.h>
@@ -101,6 +127,7 @@ extern "C" void do_another_bad_thing() {
char *volatile p = (char *)malloc(100);
printf("%hhx\n", p[105]);
}
+
#endif // SHARED_LIB
// help=1 in activation flags lists only flags are are supported at activation