2017-12-09 09:31:51 +08:00
|
|
|
//===-- sanitizer/asan_interface.h ------------------------------*- C++ -*-===//
|
|
|
|
//
|
2019-01-19 16:50:56 +08:00
|
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
2017-12-09 09:31:51 +08:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
|
|
|
// 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
|
2019-02-01 07:37:12 +08:00
|
|
|
// Libc hook for program startup in statically linked executables.
|
|
|
|
// Initializes enough of the runtime to run instrumented code. This function
|
|
|
|
// should only be called in statically linked executables because it modifies
|
|
|
|
// the GOT, which won't work in regular binaries because RELRO will already
|
|
|
|
// have been applied by the time the function is called. This also means that
|
|
|
|
// the function should be called before libc applies RELRO.
|
2018-08-14 03:57:11 +08:00
|
|
|
// Does not call libc unless there is an error.
|
2019-02-01 07:37:12 +08:00
|
|
|
// Can be called multiple times.
|
|
|
|
void __hwasan_init_static(void);
|
2018-08-14 03:57:11 +08:00
|
|
|
|
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-09-07 06:08:41 +08:00
|
|
|
// Print one-line report about the memory usage of the current process.
|
|
|
|
void __hwasan_print_memory_usage();
|
|
|
|
|
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
|