libafl/observers/
list.rs

1use alloc::{borrow::Cow, vec::Vec};
2use core::fmt::Debug;
3
4use libafl_bolts::{Error, Named, ownedref::OwnedMutPtr};
5use serde::{Deserialize, Serialize};
6
7use crate::observers::Observer;
8
9/// A simple observer with a list of things.
10#[derive(Serialize, Deserialize, Debug)]
11#[serde(bound = "T: Serialize + for<'a> Deserialize<'a>")]
12pub struct ListObserver<T> {
13    name: Cow<'static, str>,
14    /// The list
15    list: OwnedMutPtr<Vec<T>>,
16}
17
18impl<T> ListObserver<T> {
19    /// Creates a new [`ListObserver`] with the given name.
20    ///
21    /// # Safety
22    /// Will dereference the list.
23    /// The list may not move in memory.
24    #[must_use]
25    pub fn new(name: &'static str, list: OwnedMutPtr<Vec<T>>) -> Self {
26        Self {
27            name: Cow::from(name),
28            list,
29        }
30    }
31
32    /// Get a list ref
33    #[must_use]
34    pub fn list(&self) -> &Vec<T> {
35        self.list.as_ref()
36    }
37
38    /// Get a list mut
39    #[must_use]
40    pub fn list_mut(&mut self) -> &mut Vec<T> {
41        self.list.as_mut()
42    }
43}
44
45impl<I, S, T> Observer<I, S> for ListObserver<T> {
46    fn pre_exec(&mut self, _state: &mut S, _input: &I) -> Result<(), Error> {
47        self.list.as_mut().clear();
48        Ok(())
49    }
50}
51
52impl<T> Named for ListObserver<T> {
53    fn name(&self) -> &Cow<'static, str> {
54        &self.name
55    }
56}