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

Thurston Dang via llvm-commits llvm-commits at lists.llvm.org
Thu Apr 10 09:50:58 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) {
+        internal_memcpy((void *)&match, (void *)&record,
----------------
thurstond wrote:

Done

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


More information about the llvm-commits mailing list