blob: 0683e391cf23259dfaf24b97fca1b3f5faca2bf4 [file] [log] [blame]
// Test that we do not poison the array cookie if the operator new is defined
// inside the class.
// RUN: %clangxx_asan %s -o %t && %run %t
//
// XFAIL: arm
#include <new>
#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>
#include <assert.h>
struct Foo {
void *operator new(size_t s) { return Allocate(s); }
void *operator new[] (size_t s) { return Allocate(s); }
~Foo();
static void *allocated;
static void *Allocate(size_t s) {
assert(!allocated);
return allocated = ::new char[s];
}
};
Foo::~Foo() {}
void *Foo::allocated;
Foo *getFoo(size_t n) {
return new Foo[n];
}
int main() {
Foo *foo = getFoo(10);
fprintf(stderr, "foo : %p\n", foo);
fprintf(stderr, "alloc: %p\n", Foo::allocated);
assert(reinterpret_cast<uintptr_t>(foo) ==
reinterpret_cast<uintptr_t>(Foo::allocated) + sizeof(void*));
*reinterpret_cast<uintptr_t*>(Foo::allocated) = 42;
return 0;
}