sanitizer_libignore.h [plain text]
#ifndef SANITIZER_LIBIGNORE_H
#define SANITIZER_LIBIGNORE_H
#include "sanitizer_internal_defs.h"
#include "sanitizer_common.h"
#include "sanitizer_suppressions.h"
#include "sanitizer_atomic.h"
#include "sanitizer_mutex.h"
namespace __sanitizer {
class LibIgnore {
public:
explicit LibIgnore(LinkerInitialized);
void Init(const SuppressionContext &supp);
void OnLibraryLoaded(const char *name);
void OnLibraryUnloaded();
bool IsIgnored(uptr pc) const;
private:
struct Lib {
char *templ;
char *name;
char *real_name; bool loaded;
};
struct LibCodeRange {
uptr begin;
uptr end;
};
static const uptr kMaxLibs = 128;
atomic_uintptr_t loaded_count_;
LibCodeRange code_ranges_[kMaxLibs];
BlockingMutex mutex_;
uptr count_;
Lib libs_[kMaxLibs];
LibIgnore(const LibIgnore&); void operator = (const LibIgnore&); };
inline bool LibIgnore::IsIgnored(uptr pc) const {
const uptr n = atomic_load(&loaded_count_, memory_order_acquire);
for (uptr i = 0; i < n; i++) {
if (pc >= code_ranges_[i].begin && pc < code_ranges_[i].end)
return true;
}
return false;
}
}
#endif // SANITIZER_LIBIGNORE_H