lsan: Support free_sized and free_aligned_sized from C23 (#144604)
Adds support to LSan for `free_sized` and `free_aligned_sized` from C23. Other sanitizers will be handled with their own separate PRs. For https://github.com/llvm/llvm-project/issues/144435 This is attempt number 2. Signed-off-by: Justin King <jcking@google.com>
This commit is contained in:
@@ -220,6 +220,10 @@ void lsan_free(void *p) {
|
||||
Deallocate(p);
|
||||
}
|
||||
|
||||
void lsan_free_sized(void *p, uptr) { Deallocate(p); }
|
||||
|
||||
void lsan_free_aligned_sized(void *p, uptr, uptr) { Deallocate(p); }
|
||||
|
||||
void *lsan_realloc(void *p, uptr size, const StackTrace &stack) {
|
||||
return SetErrnoOnNull(Reallocate(stack, p, size, 1));
|
||||
}
|
||||
|
||||
@@ -127,6 +127,8 @@ void *lsan_aligned_alloc(uptr alignment, uptr size, const StackTrace &stack);
|
||||
void *lsan_memalign(uptr alignment, uptr size, const StackTrace &stack);
|
||||
void *lsan_malloc(uptr size, const StackTrace &stack);
|
||||
void lsan_free(void *p);
|
||||
void lsan_free_sized(void *p, uptr size);
|
||||
void lsan_free_aligned_sized(void *p, uptr alignment, uptr size);
|
||||
void *lsan_realloc(void *p, uptr size, const StackTrace &stack);
|
||||
void *lsan_reallocarray(void *p, uptr nmemb, uptr size,
|
||||
const StackTrace &stack);
|
||||
|
||||
@@ -84,6 +84,35 @@ INTERCEPTOR(void, free, void *p) {
|
||||
lsan_free(p);
|
||||
}
|
||||
|
||||
# if SANITIZER_INTERCEPT_FREE_SIZED
|
||||
INTERCEPTOR(void, free_sized, void *p, uptr size) {
|
||||
if (UNLIKELY(!p))
|
||||
return;
|
||||
if (DlsymAlloc::PointerIsMine(p))
|
||||
return DlsymAlloc::Free(p);
|
||||
ENSURE_LSAN_INITED;
|
||||
lsan_free_sized(p, size);
|
||||
}
|
||||
# define LSAN_MAYBE_INTERCEPT_FREE_SIZED INTERCEPT_FUNCTION(free_sized)
|
||||
# else
|
||||
# define LSAN_MAYBE_INTERCEPT_FREE_SIZED
|
||||
# endif
|
||||
|
||||
# if SANITIZER_INTERCEPT_FREE_ALIGNED_SIZED
|
||||
INTERCEPTOR(void, free_aligned_sized, void *p, uptr alignment, uptr size) {
|
||||
if (UNLIKELY(!p))
|
||||
return;
|
||||
if (DlsymAlloc::PointerIsMine(p))
|
||||
return DlsymAlloc::Free(p);
|
||||
ENSURE_LSAN_INITED;
|
||||
lsan_free_aligned_sized(p, alignment, size);
|
||||
}
|
||||
# define LSAN_MAYBE_INTERCEPT_FREE_ALIGNED_SIZED \
|
||||
INTERCEPT_FUNCTION(free_aligned_sized)
|
||||
# else
|
||||
# define LSAN_MAYBE_INTERCEPT_FREE_ALIGNED_SIZED
|
||||
# endif
|
||||
|
||||
INTERCEPTOR(void*, calloc, uptr nmemb, uptr size) {
|
||||
if (DlsymAlloc::Use())
|
||||
return DlsymAlloc::Callocate(nmemb, size);
|
||||
@@ -547,6 +576,8 @@ void InitializeInterceptors() {
|
||||
|
||||
INTERCEPT_FUNCTION(malloc);
|
||||
INTERCEPT_FUNCTION(free);
|
||||
LSAN_MAYBE_INTERCEPT_FREE_SIZED;
|
||||
LSAN_MAYBE_INTERCEPT_FREE_ALIGNED_SIZED;
|
||||
LSAN_MAYBE_INTERCEPT_CFREE;
|
||||
INTERCEPT_FUNCTION(calloc);
|
||||
INTERCEPT_FUNCTION(realloc);
|
||||
|
||||
@@ -44,16 +44,19 @@ using namespace __lsan;
|
||||
void *p = lsan_valloc(size, stack)
|
||||
#define COMMON_MALLOC_FREE(ptr) \
|
||||
lsan_free(ptr)
|
||||
#define COMMON_MALLOC_SIZE(ptr) \
|
||||
uptr size = lsan_mz_size(ptr)
|
||||
#define COMMON_MALLOC_FILL_STATS(zone, stats)
|
||||
#define COMMON_MALLOC_REPORT_UNKNOWN_REALLOC(ptr, zone_ptr, zone_name) \
|
||||
(void)zone_name; \
|
||||
Report("mz_realloc(%p) -- attempting to realloc unallocated memory.\n", ptr);
|
||||
#define COMMON_MALLOC_NAMESPACE __lsan
|
||||
#define COMMON_MALLOC_HAS_ZONE_ENUMERATOR 0
|
||||
#define COMMON_MALLOC_HAS_EXTRA_INTROSPECTION_INIT 0
|
||||
# define COMMON_MALLOC_FREE_SIZED(ptr, size) lsan_free_sized(ptr, size)
|
||||
# define COMMON_MALLOC_FREE_ALIGNED_SIZED(ptr, alignment, size) \
|
||||
lsan_free_aligned_sized(ptr, alignment, size)
|
||||
# define COMMON_MALLOC_SIZE(ptr) uptr size = lsan_mz_size(ptr)
|
||||
# define COMMON_MALLOC_FILL_STATS(zone, stats)
|
||||
# define COMMON_MALLOC_REPORT_UNKNOWN_REALLOC(ptr, zone_ptr, zone_name) \
|
||||
(void)zone_name; \
|
||||
Report("mz_realloc(%p) -- attempting to realloc unallocated memory.\n", \
|
||||
ptr);
|
||||
# define COMMON_MALLOC_NAMESPACE __lsan
|
||||
# define COMMON_MALLOC_HAS_ZONE_ENUMERATOR 0
|
||||
# define COMMON_MALLOC_HAS_EXTRA_INTROSPECTION_INIT 0
|
||||
|
||||
#include "sanitizer_common/sanitizer_malloc_mac.inc"
|
||||
# include "sanitizer_common/sanitizer_malloc_mac.inc"
|
||||
|
||||
#endif // SANITIZER_APPLE
|
||||
|
||||
@@ -144,6 +144,22 @@ INTERCEPTOR(void, free, void *ptr) {
|
||||
COMMON_MALLOC_FREE(ptr);
|
||||
}
|
||||
|
||||
#if SANITIZER_INTERCEPT_FREE_SIZED && defined(COMMON_MALLOC_FREE_SIZED)
|
||||
INTERCEPTOR(void, free_sized, void *ptr, size_t size) {
|
||||
COMMON_MALLOC_ENTER();
|
||||
COMMON_MALLOC_FREE_SIZED(ptr, size);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if SANITIZER_INTERCEPT_FREE_ALIGNED_SIZED && \
|
||||
defined(COMMON_MALLOC_FREE_ALIGNED_SIZED)
|
||||
INTERCEPTOR(void, free_aligned_sized, void *ptr, size_t alignment,
|
||||
size_t size) {
|
||||
COMMON_MALLOC_ENTER();
|
||||
COMMON_MALLOC_FREE_ALIGNED_SIZED(ptr, alignment, size);
|
||||
}
|
||||
#endif
|
||||
|
||||
INTERCEPTOR(void *, realloc, void *ptr, size_t size) {
|
||||
COMMON_MALLOC_ENTER();
|
||||
COMMON_MALLOC_REALLOC(ptr, size);
|
||||
|
||||
@@ -663,6 +663,17 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,
|
||||
#define SANITIZER_INTERCEPT_GETSERVBYNAME_R SI_GLIBC
|
||||
#define SANITIZER_INTERCEPT_GETSERVBYPORT_R SI_GLIBC
|
||||
|
||||
// Until free_sized and free_aligned_sized are more generally available,
|
||||
// we can only unconditionally intercept on ELF-based platforms where it
|
||||
// is okay to have undefined weak symbols.
|
||||
#ifdef __ELF__
|
||||
# define SANITIZER_INTERCEPT_FREE_SIZED 1
|
||||
# define SANITIZER_INTERCEPT_FREE_ALIGNED_SIZED 1
|
||||
#else
|
||||
# define SANITIZER_INTERCEPT_FREE_SIZED 0
|
||||
# define SANITIZER_INTERCEPT_FREE_ALIGNED_SIZED 0
|
||||
#endif
|
||||
|
||||
// This macro gives a way for downstream users to override the above
|
||||
// interceptor macros irrespective of the platform they are on. They have
|
||||
// to do two things:
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// RUN: %clang -std=c23 -O0 %s -o %t && %run %t
|
||||
// UNSUPPORTED: asan, hwasan, rtsan, tsan, msan, lsan, ubsan
|
||||
// UNSUPPORTED: asan, hwasan, rtsan, tsan, msan, ubsan
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// RUN: %clang -std=c23 -O0 %s -o %t && %run %t
|
||||
// UNSUPPORTED: asan, hwasan, rtsan, tsan, msan, lsan, ubsan
|
||||
// UNSUPPORTED: asan, hwasan, rtsan, tsan, msan, ubsan
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
Reference in New Issue
Block a user