[compiler-rt] [asan] Add experimental 'poison_history_size' flag (PR #133175)

Vitaly Buka via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 8 10:38:15 PDT 2025


================
@@ -20,11 +20,70 @@
 #include "sanitizer_common/sanitizer_flags.h"
 #include "sanitizer_common/sanitizer_interface_internal.h"
 #include "sanitizer_common/sanitizer_libc.h"
+#include "sanitizer_common/sanitizer_ring_buffer.h"
+#include "sanitizer_common/sanitizer_stackdepot.h"
 
 namespace __asan {
 
+using PoisonRecordRingBuffer = RingBuffer<struct PoisonRecord>;
+
 static atomic_uint8_t can_poison_memory;
 
+static Mutex poison_records_mutex;
+static PoisonRecordRingBuffer *poison_records = nullptr;
+
+void AddPoisonRecord(const PoisonRecord &new_record) {
+  if (flags()->poison_history_size <= 0)
+    return;
+
+  poison_records_mutex.Lock();
+
+  if (poison_records == nullptr)
+    poison_records = PoisonRecordRingBuffer::New(flags()->poison_history_size);
+
+  poison_records->push(new_record);
+
+  poison_records_mutex.Unlock();
+}
+
+bool FindPoisonRecord(uptr addr, const PoisonRecord &match) {
+  if (flags()->poison_history_size <= 0)
+    return false;
+
+  poison_records_mutex.Lock();
+
+  if (poison_records) {
+    for (unsigned int i = 0; i < poison_records->size(); i++) {
+      struct PoisonRecord record = (*poison_records)[i];
+      if (record.begin <= addr && addr < record.end) {
----------------
vitalybuka wrote:

-struct and in sizeoff

actually sizeoff is recommented by vairable: `sizeof(record)`

https://github.com/llvm/llvm-project/pull/133175


More information about the llvm-commits mailing list