Write poison to canary when removing item from diagnostic hashmap

This commit is contained in:
Xidorn Quan 2017-10-13 15:19:55 +11:00
parent 8830f62a10
commit b547e96b44

View file

@ -1,6 +1,7 @@
use hash_map::HashMap;
use std::borrow::Borrow;
use std::hash::{BuildHasher, Hash};
use std::ptr;
use FailedAllocationError;
@ -9,6 +10,11 @@ const CANARY: usize = 0x42cafe99;
#[cfg(target_pointer_width = "64")]
const CANARY: usize = 0x42cafe9942cafe99;
#[cfg(target_pointer_width = "32")]
const POISON: usize = 0xdeadbeef;
#[cfg(target_pointer_width = "64")]
const POISON: usize = 0xdeadbeefdeadbeef;
#[derive(Clone, Debug)]
enum JournalEntry {
Insert(usize),
@ -130,6 +136,9 @@ impl<K: Hash + Eq, V, S: BuildHasher> DiagnosticHashMap<K, V, S>
{
assert!(!self.readonly);
self.journal.push(JournalEntry::Remove(self.map.make_hash(k).inspect()));
if let Some(v) = self.map.get_mut(k) {
unsafe { ptr::write_volatile(&mut v.0, POISON); }
}
self.map.remove(k).map(|x| x.1)
}