2017-12-09 09:31:51 +08:00
|
|
|
//===-- sanitizer/asan_interface.h ------------------------------*- C++ -*-===//
|
|
|
|
//
|
|
|
|
// The LLVM Compiler Infrastructure
|
|
|
|
//
|
|
|
|
// This file is distributed under the University of Illinois Open Source
|
|
|
|
// License. See LICENSE.TXT for details.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
|
|
|
// This file is a part of HWAddressSanitizer.
|
|
|
|
//
|
|
|
|
// Public interface header.
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef SANITIZER_HWASAN_INTERFACE_H
|
|
|
|
#define SANITIZER_HWASAN_INTERFACE_H
|
|
|
|
|
|
|
|
#include <sanitizer/common_interface_defs.h>
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
2018-08-14 03:57:11 +08:00
|
|
|
// Initialize shadow but not the rest of the runtime.
|
|
|
|
// Does not call libc unless there is an error.
|
|
|
|
// Can be called multiple times, or not at all (in which case shadow will
|
|
|
|
// be initialized in compiler-inserted __hwasan_init() call).
|
|
|
|
void __hwasan_shadow_init(void);
|
|
|
|
|
2017-12-09 09:31:51 +08:00
|
|
|
// This function may be optionally provided by user and should return
|
|
|
|
// a string containing HWASan runtime options. See asan_flags.h for details.
|
2017-12-22 04:51:16 +08:00
|
|
|
const char* __hwasan_default_options(void);
|
2017-12-09 09:31:51 +08:00
|
|
|
|
2017-12-22 04:51:16 +08:00
|
|
|
void __hwasan_enable_allocator_tagging(void);
|
|
|
|
void __hwasan_disable_allocator_tagging(void);
|
2017-12-09 09:31:51 +08:00
|
|
|
|
2018-08-15 08:39:35 +08:00
|
|
|
// Mark region of memory with the given tag. Both address and size need to be
|
|
|
|
// 16-byte aligned.
|
|
|
|
void __hwasan_tag_memory(const volatile void *p, unsigned char tag,
|
|
|
|
size_t size);
|
|
|
|
|
|
|
|
/// Set pointer tag. Previous tag is lost.
|
|
|
|
void *__hwasan_tag_pointer(const volatile void *p, unsigned char tag);
|
|
|
|
|
2018-08-17 07:17:14 +08:00
|
|
|
// Set memory tag from the current SP address to the given address to zero.
|
|
|
|
// This is meant to annotate longjmp and other non-local jumps.
|
|
|
|
// This function needs to know the (almost) exact destination frame address;
|
|
|
|
// clearing shadow for the entire thread stack like __asan_handle_no_return
|
|
|
|
// does would cause false reports.
|
|
|
|
void __hwasan_handle_longjmp(const void *sp_dst);
|
|
|
|
|
[hwasan] Add a (almost) no-interceptor mode.
Summary:
The idea behind this change is to allow sanitization of libc. We are prototyping on Bionic,
but the tool interface will be general enough (or at least generalizable) to support any other libc.
When libc depends on libclang_rt.hwasan, the latter can not interpose libc functions.
In fact, majority of interceptors become unnecessary when libc code is instrumented.
This change gets rid of most hwasan interceptors and provides interface for libc to notify
hwasan about thread creation and destruction events. Some interceptors (pthread_create)
are kept under #ifdef to enable testing with uninstrumented libc. They are expressed in
terms of the new libc interface.
The new cmake switch, COMPILER_RT_HWASAN_WITH_INTERCEPTORS, ON by default, builds testing
version of the library with the aforementioned pthread_create interceptor.
With the OFF setting, the library becomes more of a libc plugin.
Reviewers: vitalybuka, kcc, jfb
Subscribers: srhines, kubamracek, mgorny, jfb, llvm-commits
Differential Revision: https://reviews.llvm.org/D50922
llvm-svn: 340216
2018-08-21 05:49:15 +08:00
|
|
|
// Libc hook for thread creation. Should be called in the child thread before
|
|
|
|
// any instrumented code.
|
|
|
|
void __hwasan_thread_enter();
|
|
|
|
|
|
|
|
// Libc hook for thread destruction. No instrumented code should run after
|
|
|
|
// this call.
|
|
|
|
void __hwasan_thread_exit();
|
|
|
|
|
2018-08-15 08:39:35 +08:00
|
|
|
// Print shadow and origin for the memory range to stderr in a human-readable
|
|
|
|
// format.
|
|
|
|
void __hwasan_print_shadow(const volatile void *x, size_t size);
|
|
|
|
|
2018-08-14 05:07:27 +08:00
|
|
|
int __sanitizer_posix_memalign(void **memptr, size_t alignment, size_t size);
|
|
|
|
void * __sanitizer_memalign(size_t alignment, size_t size);
|
|
|
|
void * __sanitizer_aligned_alloc(size_t alignment, size_t size);
|
|
|
|
void * __sanitizer___libc_memalign(size_t alignment, size_t size);
|
|
|
|
void * __sanitizer_valloc(size_t size);
|
|
|
|
void * __sanitizer_pvalloc(size_t size);
|
|
|
|
void __sanitizer_free(void *ptr);
|
|
|
|
void __sanitizer_cfree(void *ptr);
|
|
|
|
size_t __sanitizer_malloc_usable_size(const void *ptr);
|
|
|
|
struct mallinfo __sanitizer_mallinfo();
|
|
|
|
int __sanitizer_mallopt(int cmd, int value);
|
|
|
|
void __sanitizer_malloc_stats(void);
|
|
|
|
void * __sanitizer_calloc(size_t nmemb, size_t size);
|
|
|
|
void * __sanitizer_realloc(void *ptr, size_t size);
|
|
|
|
void * __sanitizer_malloc(size_t size);
|
2017-12-09 09:31:51 +08:00
|
|
|
#ifdef __cplusplus
|
|
|
|
} // extern "C"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif // SANITIZER_HWASAN_INTERFACE_H
|