skip unchanged interrupts

This commit is contained in:
Alwin Berger 2023-04-20 16:50:23 +02:00
parent eb04325f09
commit a3e38b6abb

View File

@ -207,7 +207,8 @@ where
.get(corpus_idx)? .get(corpus_idx)?
.borrow_mut().clone(); .borrow_mut().clone();
let mut newinput = _input.input_mut().as_mut().unwrap().clone(); let mut newinput = _input.input_mut().as_mut().unwrap().clone();
let mut tmpinput = _input.input_mut().as_mut().unwrap().clone(); // let mut tmpinput = _input.input_mut().as_mut().unwrap().clone();
let mut do_rerun = false;
{ {
// need our own random generator, because borrowing rules // need our own random generator, because borrowing rules
let mut myrand = StdRand::new(); let mut myrand = StdRand::new();
@ -230,11 +231,10 @@ where
for j in 0 as usize..4 as usize { for j in 0 as usize..4 as usize {
t[j]=target_bytes[i*4+j]; t[j]=target_bytes[i*4+j];
} }
if i == 0 { if i == 0 || true {
start_tick = u32::from_le_bytes(t); start_tick = u32::from_le_bytes(t);
} else { } else {
// start_tick = u32::saturating_add(start_tick,max(MINIMUM_INTER_ARRIVAL_TIME,u32::from_le_bytes(t))); start_tick = u32::saturating_add(start_tick,max(MINIMUM_INTER_ARRIVAL_TIME,u32::from_le_bytes(t)));
start_tick = u32::from_le_bytes(t);
} }
interrupt_offsets[i] = start_tick; interrupt_offsets[i] = start_tick;
num_interrupts = i+1; num_interrupts = i+1;
@ -243,7 +243,7 @@ where
} }
interrupt_offsets.sort(); interrupt_offsets.sort();
println!("Vor Mutator: {:?}", interrupt_offsets[0..num_interrupts].to_vec()); // println!("Vor Mutator: {:?}", interrupt_offsets[0..num_interrupts].to_vec());
// let num_i = min(target_bytes.len() / 4, DO_NUM_INTERRUPT); // let num_i = min(target_bytes.len() / 4, DO_NUM_INTERRUPT);
let mut suffix = target_bytes.split_off(4 * num_interrupts); let mut suffix = target_bytes.split_off(4 * num_interrupts);
let mut prefix : Vec<[u8; 4]> = vec![]; let mut prefix : Vec<[u8; 4]> = vec![];
@ -262,10 +262,10 @@ where
let m = interrupt_offsets[0..num_interrupts].iter().any(|x| (curr.start_tick..curr.end_tick).contains(&(*x as u64))); let m = interrupt_offsets[0..num_interrupts].iter().any(|x| (curr.start_tick..curr.end_tick).contains(&(*x as u64)));
if m { if m {
marks.push((curr, i, 1)); marks.push((curr, i, 1));
println!("1: {}",curr.current_task.task_name); // println!("1: {}",curr.current_task.task_name);
} else if last_m { } else if last_m {
marks.push((curr, i, 2)); marks.push((curr, i, 2));
println!("2: {}",curr.current_task.task_name); // println!("2: {}",curr.current_task.task_name);
} else { } else {
marks.push((curr, i, 0)); marks.push((curr, i, 0));
} }
@ -293,6 +293,7 @@ where
}; };
// find reachable alternatives // find reachable alternatives
let alternatives : Vec<_> = marks.iter().filter(|x| let alternatives : Vec<_> = marks.iter().filter(|x|
x.2 != 2 &&
( (
x.0.start_tick < (lb as u64) && (lb as u64) < x.0.end_tick x.0.start_tick < (lb as u64) && (lb as u64) < x.0.end_tick
|| x.0.start_tick < (ub as u64) && (ub as u64) < x.0.end_tick ) || x.0.start_tick < (ub as u64) && (ub as u64) < x.0.end_tick )
@ -308,18 +309,19 @@ where
let choice = myrand.choose(untouched); let choice = myrand.choose(untouched);
interrupt_offsets[i] = myrand.between(choice.0.start_tick, choice.0.end_tick) interrupt_offsets[i] = myrand.between(choice.0.start_tick, choice.0.end_tick)
.try_into().expect("tick > u32"); .try_into().expect("tick > u32");
println!("no alternatives, choose random i: {} {} -> {}",i,tmp,interrupt_offsets[i]); do_rerun = true;
// println!("no alternatives, choose random i: {} {} -> {}",i,tmp,interrupt_offsets[i]);
continue; continue;
} else { } else {
// do nothing // do nothing
println!("no alternatives, do nothing i: {} {}",i,interrupt_offsets[i]); // println!("no alternatives, do nothing i: {} {}",i,interrupt_offsets[i]);
continue; continue;
} }
} }
let replacement = myrand.choose(alternatives); let replacement = myrand.choose(alternatives);
if (old_hit.map_or(false, |x| x == replacement)) { if (old_hit.map_or(false, |x| x == replacement)) {
// use the old value // use the old value
println!("chose old value, do nothing i: {} {}",i,interrupt_offsets[i]); // println!("chose old value, do nothing i: {} {}",i,interrupt_offsets[i]);
continue; continue;
} else { } else {
let extra = if (old_hit.map_or(false, |x| x.1 < replacement.1)) { let extra = if (old_hit.map_or(false, |x| x.1 < replacement.1)) {
@ -329,12 +331,13 @@ where
let tmp = interrupt_offsets[i]; let tmp = interrupt_offsets[i];
interrupt_offsets[i] = (myrand.between(replacement.0.start_tick, interrupt_offsets[i] = (myrand.between(replacement.0.start_tick,
replacement.0.end_tick) + extra).try_into().expect("ticks > u32"); replacement.0.end_tick) + extra).try_into().expect("ticks > u32");
println!("chose new alternative, i: {} {} -> {}",i,tmp, interrupt_offsets[i]); // println!("chose new alternative, i: {} {} -> {}",i,tmp, interrupt_offsets[i]);
do_rerun = true;
} }
} }
let mut numbers : Vec<u32> = interrupt_offsets[0..num_interrupts].to_vec(); let mut numbers : Vec<u32> = interrupt_offsets[0..num_interrupts].to_vec();
numbers.sort(); numbers.sort();
println!("Mutator: {:?}", numbers); // println!("Mutator: {:?}", numbers);
let mut start : u32 = 0; let mut start : u32 = 0;
// for i in 0..numbers.len() { // for i in 0..numbers.len() {
// let tmp = numbers[i]; // let tmp = numbers[i];
@ -353,7 +356,9 @@ where
newinput.bytes_mut().append(&mut n); newinput.bytes_mut().append(&mut n);
} }
// InterruptShifterMutator::mutate(&mut mymut, state, &mut input, 0)?; // InterruptShifterMutator::mutate(&mut mymut, state, &mut input, 0)?;
let (_, corpus_idx) = fuzzer.evaluate_input(state, executor, manager, newinput)?; if do_rerun {
let (_, corpus_idx) = fuzzer.evaluate_input(state, executor, manager, newinput)?;
}
Ok(()) Ok(())
} }
} }