mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-29 13:16:06 +00:00

* The performance is better than the glibc allocator. * Allocator interface functions, sanitizer allocator options, and MallocHooks/FreeHooks are supported. * Shadow memory has specific memory layout requirement. Using libc allocator could lead to conflicts. * When we add a mmap interceptor for reliability (the VMA could reuse a previously released VMA that is poisoned): glibc may invoke an internal system call to call unmmap, which cannot be intercepted. We will not be able to return the shadow memory to the OS. Similar to dfsan https://reviews.llvm.org/D101204 . Also intercept operator new/delete to be similar to other sanitizers using the sanitizer allocator. The align_val_t overload of operator new has slightly less overhead. Pull Request: https://github.com/llvm/llvm-project/pull/102764
74 lines
1.8 KiB
C++
74 lines
1.8 KiB
C++
//===- nsan_thread.h --------------------------------------------*- C++ -*-===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef NSAN_THREAD_H
|
|
#define NSAN_THREAD_H
|
|
|
|
#include "nsan_allocator.h"
|
|
#include "sanitizer_common/sanitizer_common.h"
|
|
#include "sanitizer_common/sanitizer_posix.h"
|
|
|
|
namespace __nsan {
|
|
|
|
class NsanThread {
|
|
public:
|
|
static NsanThread *Create(thread_callback_t start_routine, void *arg);
|
|
static void TSDDtor(void *tsd);
|
|
void Destroy();
|
|
|
|
void Init(); // Should be called from the thread itself.
|
|
thread_return_t ThreadStart();
|
|
|
|
uptr stack_top();
|
|
uptr stack_bottom();
|
|
uptr tls_begin() { return tls_begin_; }
|
|
uptr tls_end() { return tls_end_; }
|
|
bool IsMainThread() { return start_routine_ == nullptr; }
|
|
|
|
bool AddrIsInStack(uptr addr);
|
|
|
|
void StartSwitchFiber(uptr bottom, uptr size);
|
|
void FinishSwitchFiber(uptr *bottom_old, uptr *size_old);
|
|
|
|
NsanThreadLocalMallocStorage &malloc_storage() { return malloc_storage_; }
|
|
|
|
int destructor_iterations_;
|
|
__sanitizer_sigset_t starting_sigset_;
|
|
|
|
private:
|
|
void SetThreadStackAndTls();
|
|
void ClearShadowForThreadStackAndTLS();
|
|
struct StackBounds {
|
|
uptr bottom;
|
|
uptr top;
|
|
};
|
|
StackBounds GetStackBounds() const;
|
|
|
|
thread_callback_t start_routine_;
|
|
void *arg_;
|
|
|
|
bool stack_switching_;
|
|
|
|
StackBounds stack_;
|
|
StackBounds next_stack_;
|
|
|
|
uptr tls_begin_;
|
|
uptr tls_end_;
|
|
|
|
NsanThreadLocalMallocStorage malloc_storage_;
|
|
};
|
|
|
|
NsanThread *GetCurrentThread();
|
|
void SetCurrentThread(NsanThread *t);
|
|
void NsanTSDInit(void (*destructor)(void *tsd));
|
|
void NsanTSDDtor(void *tsd);
|
|
|
|
} // namespace __nsan
|
|
|
|
#endif // NSAN_THREAD_H
|