From 861bb4d44b16545d619fa9525622d98985ed2a3a Mon Sep 17 00:00:00 2001 From: Andrea Fioraldi Date: Tue, 23 Feb 2021 20:24:59 +0100 Subject: [PATCH] cached len --- libafl/src/corpus/minset.rs | 2 +- libafl/src/corpus/testcase.rs | 37 ++++++++++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/libafl/src/corpus/minset.rs b/libafl/src/corpus/minset.rs index 713573ceb6..3fac83917d 100644 --- a/libafl/src/corpus/minset.rs +++ b/libafl/src/corpus/minset.rs @@ -21,7 +21,7 @@ impl FavFactor for LenTimeMulFavFactor { where I: Input + HasLen { - entry.exec_time() * entry.load_input().len() + entry.exec_time().as_usec() * (entry.cached_len()? as u64) } } diff --git a/libafl/src/corpus/testcase.rs b/libafl/src/corpus/testcase.rs index 984f5530e2..d4150d8a0e 100644 --- a/libafl/src/corpus/testcase.rs +++ b/libafl/src/corpus/testcase.rs @@ -7,7 +7,7 @@ use serde::{Deserialize, Serialize}; use crate::{ bolts::serdeany::{SerdeAny, SerdeAnyMap}, - inputs::Input, + inputs::{HasLen, Input}, Error, }; @@ -28,6 +28,8 @@ where metadatas: SerdeAnyMap, /// Time needed to execute the input exec_time: Option, + /// Cached len of the input, if any + cached_len: Option } /// Impl of a testcase @@ -72,6 +74,7 @@ where /// Get the input, if any (mutable) #[inline] pub fn input_mut(&mut self) -> &mut Option { + // self.cached_len = None; &mut self.input } @@ -144,6 +147,7 @@ where fitness: 0, metadatas: SerdeAnyMap::new(), exec_time: None, + cached_len: None } } @@ -156,6 +160,7 @@ where fitness: 0, metadatas: SerdeAnyMap::new(), exec_time: None, + cached_len: None } } @@ -168,6 +173,7 @@ where fitness: fitness, metadatas: SerdeAnyMap::new(), exec_time: None, + cached_len: None } } @@ -179,10 +185,39 @@ where fitness: 0, metadatas: SerdeAnyMap::new(), exec_time: None, + cached_len: None } } } +/// Impl of a testcase when the input has len +impl Testcase +where + I: Input + HasLen, +{ + /// Get the cached len + #[inline] + pub fn cached_len(&mut self) -> Result { + Ok(match &self.input { + Some(i) => { + let l = i.len(); + self.cached_len = Some(l); + l + }, + None => { + match self.cached_len { + Some(l) => l, + None => { + let l = self.load_input()?.len(); + self.cached_len = Some(l); + l + } + } + } + }) + } +} + /// Create a testcase from an input impl From for Testcase where