libafl/observers/
value.rs

1//! A simple observer with a single value.
2
3use alloc::{borrow::Cow, boxed::Box, vec::Vec};
4use core::{
5    cell::{Ref, RefCell, RefMut},
6    fmt::Debug,
7    hash::{Hash, Hasher},
8    ops::{Deref, DerefMut},
9};
10
11use ahash::RandomState;
12use libafl_bolts::{AsIter, AsIterMut, AsSlice, AsSliceMut, HasLen, Named, ownedref::OwnedRef};
13use serde::{Deserialize, Serialize, de::DeserializeOwned};
14
15use crate::{
16    Error,
17    observers::{MapObserver, Observer, ObserverWithHashField},
18};
19
20/// A simple observer with a single value.
21///
22/// The intent is that the value is something with interior mutability which the target could write to even though this
23/// observer has a reference to it. Use [`RefCellValueObserver`] if using a [`RefCell`] around the value.
24#[derive(Serialize, Deserialize, Debug)]
25#[expect(clippy::unsafe_derive_deserialize)]
26pub struct ValueObserver<'a, T> {
27    /// The name of this observer.
28    name: Cow<'static, str>,
29    /// The value.
30    pub value: OwnedRef<'a, T>,
31}
32
33impl<'a, T> ValueObserver<'a, T> {
34    /// Creates a new [`ValueObserver`] with the given name.
35    #[must_use]
36    pub fn new(name: &'static str, value: OwnedRef<'a, T>) -> Self {
37        Self {
38            name: Cow::from(name),
39            value,
40        }
41    }
42
43    /// Get a reference to the underlying value.
44    #[must_use]
45    pub fn get_ref(&self) -> &T {
46        self.value.as_ref()
47    }
48
49    /// Set the value.
50    pub fn set(&mut self, new_value: T) {
51        self.value = OwnedRef::Owned(Box::new(new_value));
52    }
53
54    /// Clone or move the current value out of this object.
55    #[must_use]
56    pub fn take(self) -> T
57    where
58        T: Clone,
59    {
60        match self.value {
61            OwnedRef::RefRaw(r, _) => unsafe { (*r).clone() },
62            OwnedRef::Ref(r) => r.clone(),
63            OwnedRef::Owned(v) => *v,
64        }
65    }
66}
67
68/// This *does not* reset the value inside the observer.
69impl<I, S, T> Observer<I, S> for ValueObserver<'_, T> {}
70
71impl<T> Named for ValueObserver<'_, T> {
72    fn name(&self) -> &Cow<'static, str> {
73        &self.name
74    }
75}
76
77impl<T: Hash> ObserverWithHashField for ValueObserver<'_, T> {
78    fn hash(&self) -> Option<u64> {
79        Some(RandomState::with_seeds(1, 2, 3, 4).hash_one(self.value.as_ref()))
80    }
81}
82
83/// A simple observer with a single [`RefCell`]'d value.
84#[derive(Serialize, Deserialize, Debug)]
85#[expect(clippy::unsafe_derive_deserialize)]
86pub struct RefCellValueObserver<'a, T> {
87    /// The name of this observer.
88    name: Cow<'static, str>,
89    /// The value.
90    pub value: OwnedRef<'a, RefCell<T>>,
91}
92
93impl<'a, T> RefCellValueObserver<'a, T> {
94    /// Creates a new [`RefCellValueObserver`] with the given name.
95    #[must_use]
96    pub fn new(name: &'static str, value: OwnedRef<'a, RefCell<T>>) -> Self {
97        Self {
98            name: Cow::from(name),
99            value,
100        }
101    }
102
103    /// Get a reference to the underlying value.
104    ///
105    /// Panics if it can't borrow.
106    #[must_use]
107    pub fn get_ref<'b>(&'b self) -> Ref<'a, T>
108    where
109        'b: 'a,
110    {
111        self.value.as_ref().borrow()
112    }
113
114    /// Get a mutable reference to the underlying value.
115    ///
116    /// Panics if it can't borrow.
117    #[must_use]
118    pub fn get_ref_mut<'b>(&'b self) -> RefMut<'a, T>
119    where
120        'b: 'a,
121    {
122        self.value.as_ref().borrow_mut()
123    }
124
125    /// Set the value.
126    pub fn set(&mut self, new_value: T) {
127        self.value.as_ref().replace(new_value);
128    }
129
130    /// Clone or move the current value out of this object.
131    #[must_use]
132    pub fn take(self) -> T
133    where
134        T: Clone,
135    {
136        match self.value {
137            OwnedRef::RefRaw(r, _) => unsafe { (*r).borrow().deref().clone() },
138            OwnedRef::Ref(r) => r.borrow().deref().clone(),
139            OwnedRef::Owned(v) => v.borrow().clone(),
140        }
141    }
142}
143
144/// This *does not* reset the value inside the observer.
145impl<I, S, T> Observer<I, S> for RefCellValueObserver<'_, T> {}
146
147impl<T> Named for RefCellValueObserver<'_, T> {
148    fn name(&self) -> &Cow<'static, str> {
149        &self.name
150    }
151}
152
153impl<T> ObserverWithHashField for RefCellValueObserver<'_, T>
154where
155    T: Hash,
156{
157    fn hash(&self) -> Option<u64> {
158        Some(RandomState::with_seeds(1, 2, 3, 4).hash_one(&*self.value.as_ref().borrow()))
159    }
160}
161
162/// [`Iterator`] over [`RefCellValueObserver`] of a [`Deref`] to `[T]`.
163#[derive(Debug)]
164pub struct RefCellValueObserverIter<'it, T> {
165    v: Ref<'it, [T]>,
166}
167
168impl<'it, T: 'it, A: Deref<Target = [T]>> AsSlice<'it> for RefCellValueObserver<'_, A> {
169    type Entry = T;
170    type SliceRef = Ref<'it, [T]>;
171
172    fn as_slice(&'it self) -> Self::SliceRef {
173        Ref::map(self.value.as_ref().borrow(), |s| &**s)
174    }
175}
176
177impl<'it, T: 'it, A: DerefMut<Target = [T]>> AsSliceMut<'it> for RefCellValueObserver<'_, A> {
178    type SliceRefMut = RefMut<'it, [T]>;
179
180    fn as_slice_mut(&'it mut self) -> Self::SliceRefMut {
181        RefMut::map(self.value.as_ref().borrow_mut(), |s| &mut **s)
182    }
183}
184
185impl<'it, T: 'it, A: Deref<Target = [T]>> AsIter<'it> for RefCellValueObserver<'_, A> {
186    type Item = T;
187    type Ref = Ref<'it, Self::Item>;
188    type IntoIter = RefCellValueObserverIter<'it, T>;
189
190    fn as_iter(&'it self) -> Self::IntoIter {
191        Self::IntoIter {
192            v: Ref::map(self.value.as_ref().borrow(), Deref::deref),
193        }
194    }
195}
196
197impl<'it, T: 'it> Iterator for RefCellValueObserverIter<'it, T> {
198    type Item = Ref<'it, T>;
199
200    fn next(&mut self) -> Option<Self::Item> {
201        if self.v.is_empty() {
202            return None;
203        }
204        let cloned = Ref::clone(&self.v);
205        let (next, remainder) = Ref::map_split(cloned, |v| (&v[0], &v[1..]));
206        self.v = remainder;
207        Some(next)
208    }
209}
210
211/// [`Iterator`] over [`RefCellValueObserver`] of a [`DerefMut`] to `[T]`.
212#[derive(Debug)]
213pub struct RefCellValueObserverIterMut<'it, T> {
214    v: Option<RefMut<'it, [T]>>,
215}
216
217impl<'it, T: 'it, A: DerefMut<Target = [T]> + Serialize> AsIterMut<'it>
218    for RefCellValueObserver<'_, A>
219{
220    type RefMut = RefMut<'it, T>;
221    type IntoIterMut = RefCellValueObserverIterMut<'it, T>;
222
223    fn as_iter_mut(&'it mut self) -> Self::IntoIterMut {
224        Self::IntoIterMut {
225            v: Some(RefMut::map(
226                self.value.as_ref().borrow_mut(),
227                DerefMut::deref_mut,
228            )),
229        }
230    }
231}
232
233impl<'it, T: 'it> Iterator for RefCellValueObserverIterMut<'it, T> {
234    type Item = RefMut<'it, T>;
235
236    fn next(&mut self) -> Option<Self::Item> {
237        match self.v.take() {
238            Some(v) => {
239                let next_slice = if v.len() > 1 {
240                    let (next, remainder) = RefMut::map_split(v, |v| v.split_at_mut(1));
241                    self.v = Some(remainder);
242                    next
243                } else {
244                    v
245                };
246                Some(RefMut::map(next_slice, |v| &mut v[0]))
247            }
248            _ => None,
249        }
250    }
251}
252
253impl<A: Hash> Hash for RefCellValueObserver<'_, A> {
254    /// Panics if the contained value is already mutably borrowed (calls
255    /// [`RefCell::borrow`]).
256    #[inline]
257    fn hash<H: Hasher>(&self, hasher: &mut H) {
258        self.get_ref().hash(hasher);
259    }
260}
261
262/// Panics if the contained value is already mutably borrowed (calls
263/// [`RefCell::borrow`]).
264impl<A> HasLen for RefCellValueObserver<'_, A>
265where
266    A: HasLen,
267{
268    /// Panics if the contained value is already mutably borrowed (calls
269    /// [`RefCell::borrow`]).
270    fn len(&self) -> usize {
271        self.get_ref().len()
272    }
273
274    /// Panics if the contained value is already mutably borrowed (calls
275    /// [`RefCell::borrow`]).
276    fn is_empty(&self) -> bool {
277        self.get_ref().is_empty()
278    }
279}
280
281impl<T> AsRef<Self> for RefCellValueObserver<'_, T> {
282    fn as_ref(&self) -> &Self {
283        self
284    }
285}
286
287impl<T> AsMut<Self> for RefCellValueObserver<'_, T> {
288    fn as_mut(&mut self) -> &mut Self {
289        self
290    }
291}
292
293impl<T, A> MapObserver for RefCellValueObserver<'_, A>
294where
295    T: PartialEq + Copy + Hash + Default + DeserializeOwned + Serialize + Debug,
296    A: DerefMut<Target = [T]> + Hash + Serialize + DeserializeOwned + HasLen + Default,
297{
298    type Entry = T;
299
300    /// Panics if the contained value is already mutably borrowed (calls
301    /// [`RefCell::borrow`]).
302    fn get(&self, idx: usize) -> Self::Entry {
303        self.get_ref()[idx]
304    }
305
306    /// Panics if the contained value is already borrowed (calls
307    /// [`RefCell::borrow_mut`]).
308    fn set(&mut self, idx: usize, val: Self::Entry) {
309        self.get_ref_mut()[idx] = val;
310    }
311
312    /// Panics if the contained value is already mutably borrowed (calls
313    /// [`RefCell::borrow`]).
314    fn usable_count(&self) -> usize {
315        self.get_ref().len()
316    }
317
318    /// Panics if the contained value is already mutably borrowed (calls
319    /// [`RefCell::borrow`]).
320    fn count_bytes(&self) -> u64 {
321        let default = Self::Entry::default();
322        let mut count = 0;
323        for entry in self.get_ref().iter() {
324            if entry != &default {
325                count += 1;
326            }
327        }
328        count
329    }
330
331    /// Panics if the contained value is already borrowed (calls
332    /// [`RefCell::borrow_mut`]).
333    fn reset_map(&mut self) -> Result<(), Error> {
334        // This is less than optimal for `Vec`, for which we could use
335        // `.clear()`. However, it makes the `impl` more general. Worth it?
336        *self.get_ref_mut() = A::default();
337        Ok(())
338    }
339
340    /// Panics if the contained value is already mutably borrowed (calls
341    /// [`RefCell::borrow`]).
342    fn to_vec(&self) -> Vec<Self::Entry> {
343        self.get_ref().to_vec()
344    }
345
346    /// Panics if the contained value is already mutably borrowed (calls
347    /// [`RefCell::borrow`]).
348    fn how_many_set(&self, indexes: &[usize]) -> usize {
349        let default = Self::Entry::default();
350        let mut count = 0;
351        let arr = self.get_ref();
352        for idx in indexes {
353            if arr[*idx] != default {
354                count += 1;
355            }
356        }
357        count
358    }
359
360    fn initial(&self) -> Self::Entry {
361        Self::Entry::default()
362    }
363}