forked from OSchip/llvm-project
parent
1e310295d0
commit
67d508d083
|
@ -811,10 +811,22 @@ int asan_posix_memalign(void **memptr, size_t alignment, size_t size,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void GetAllocationSizeAndOwnership(const void *ptr, size_t *size,
|
||||
bool *owned) {
|
||||
size_t allocation_size = malloc_info.AllocationSize((uintptr_t)ptr);
|
||||
if (size != NULL) {
|
||||
*size = allocation_size;
|
||||
}
|
||||
if (owned != NULL) {
|
||||
*owned = (ptr == NULL) || (allocation_size > 0);
|
||||
}
|
||||
}
|
||||
|
||||
size_t asan_malloc_usable_size(void *ptr, AsanStackTrace *stack) {
|
||||
CHECK(stack);
|
||||
size_t usable_size = malloc_info.AllocationSize((uintptr_t)ptr);
|
||||
if (usable_size == 0) {
|
||||
size_t usable_size;
|
||||
bool owned;
|
||||
GetAllocationSizeAndOwnership(ptr, &usable_size, &owned);
|
||||
if (!owned) {
|
||||
Report("ERROR: AddressSanitizer attempting to call malloc_usable_size() "
|
||||
"for pointer which is not owned: %p\n", ptr);
|
||||
stack->PrintStack();
|
||||
|
@ -825,7 +837,9 @@ size_t asan_malloc_usable_size(void *ptr, AsanStackTrace *stack) {
|
|||
}
|
||||
|
||||
size_t asan_mz_size(const void *ptr) {
|
||||
return malloc_info.AllocationSize((uintptr_t)ptr);
|
||||
size_t mz_size;
|
||||
GetAllocationSizeAndOwnership(ptr, &mz_size, NULL);
|
||||
return mz_size;
|
||||
}
|
||||
|
||||
void DescribeHeapAddress(uintptr_t addr, uintptr_t access_size) {
|
||||
|
@ -1012,13 +1026,17 @@ size_t __asan_get_estimated_allocated_size(size_t size) {
|
|||
}
|
||||
|
||||
bool __asan_get_ownership(const void *p) {
|
||||
return malloc_info.AllocationSize((uintptr_t)p) > 0;
|
||||
bool owned;
|
||||
GetAllocationSizeAndOwnership(p, NULL, &owned);
|
||||
return owned;
|
||||
}
|
||||
|
||||
size_t __asan_get_allocated_size(const void *p) {
|
||||
size_t allocated_size = malloc_info.AllocationSize((uintptr_t)p);
|
||||
size_t allocated_size;
|
||||
bool owned;
|
||||
GetAllocationSizeAndOwnership(p, &allocated_size, &owned);
|
||||
// Die if p is not malloced or if it is already freed.
|
||||
if (allocated_size == 0) {
|
||||
if (!owned) {
|
||||
Report("ERROR: AddressSanitizer attempting to call "
|
||||
"__asan_get_allocated_size() for pointer which is "
|
||||
"not owned: %p\n", p);
|
||||
|
|
|
@ -107,11 +107,11 @@ extern "C" {
|
|||
// memory, returns the maximal possible allocation size, otherwise returns
|
||||
// "size".
|
||||
size_t __asan_get_estimated_allocated_size(size_t size);
|
||||
// Returns true if p was returned by the ASan allocator and
|
||||
// Returns true if p is NULL or if p was returned by the ASan allocator and
|
||||
// is not yet freed.
|
||||
bool __asan_get_ownership(const void *p);
|
||||
// Returns the number of bytes reserved for the pointer p.
|
||||
// Requires (__asan_get_ownership(p) == true).
|
||||
// Requires (get_ownership(p) == true).
|
||||
size_t __asan_get_allocated_size(const void *p);
|
||||
// Number of bytes, allocated and not yet freed by the application.
|
||||
size_t __asan_get_current_allocated_bytes();
|
||||
|
|
|
@ -44,14 +44,16 @@ TEST(AddressSanitizerInterface, GetAllocatedSizeAndOwnershipTest) {
|
|||
// We cannot call GetAllocatedSize from the memory we didn't map,
|
||||
// and from the interior pointers (not returned by previous malloc).
|
||||
void *wild_addr = (void*)0x1;
|
||||
EXPECT_EQ(false, __asan_get_ownership(NULL));
|
||||
EXPECT_DEATH(__asan_get_allocated_size(NULL), kGetAllocatedSizeErrorMsg);
|
||||
EXPECT_EQ(false, __asan_get_ownership(wild_addr));
|
||||
EXPECT_DEATH(__asan_get_allocated_size(wild_addr), kGetAllocatedSizeErrorMsg);
|
||||
EXPECT_EQ(false, __asan_get_ownership(array + kArraySize / 2));
|
||||
EXPECT_DEATH(__asan_get_allocated_size(array + kArraySize / 2),
|
||||
kGetAllocatedSizeErrorMsg);
|
||||
|
||||
// NULL is a valid argument and is owned.
|
||||
EXPECT_EQ(true, __asan_get_ownership(NULL));
|
||||
EXPECT_EQ(0, __asan_get_allocated_size(NULL));
|
||||
|
||||
// When memory is freed, it's not owned, and call to GetAllocatedSize
|
||||
// is forbidden.
|
||||
free(array);
|
||||
|
|
|
@ -528,9 +528,9 @@ TEST(AddressSanitizer, MallocUsableSizeTest) {
|
|||
const size_t kArraySize = 100;
|
||||
char *array = Ident((char*)malloc(kArraySize));
|
||||
int *int_ptr = Ident(new int);
|
||||
EXPECT_EQ(0, malloc_usable_size(NULL));
|
||||
EXPECT_EQ(kArraySize, malloc_usable_size(array));
|
||||
EXPECT_EQ(sizeof(int), malloc_usable_size(int_ptr));
|
||||
EXPECT_DEATH(malloc_usable_size(NULL), kMallocUsableSizeErrorMsg);
|
||||
EXPECT_DEATH(malloc_usable_size((void*)0x123), kMallocUsableSizeErrorMsg);
|
||||
EXPECT_DEATH(malloc_usable_size(array + kArraySize / 2),
|
||||
kMallocUsableSizeErrorMsg);
|
||||
|
|
Loading…
Reference in New Issue