use crate::bitvector::BV;
use crate::ir::*;
use crate::log;
use crate::simplify::EventReferences;
use crate::smt::{Solver, Sym};
use crate::zencode;
pub fn taint_info<B: BV>(log_type: u32, sym: Sym, shared_state: Option<&SharedState<B>>, solver: &Solver<B>) {
let events = solver.trace().to_vec();
let references = EventReferences::from_events(&events);
let (taints, memory) = references.taints(sym, &events);
let taints: Vec<String> = taints
.iter()
.map(|(reg, _)| {
if let Some(shared_state) = shared_state {
zencode::decode(shared_state.symtab.to_str(*reg))
} else {
format!("{:?}", reg)
}
})
.collect();
let memory = if memory { ", MEMORY" } else { "" };
log!(log_type, &format!("Symbol {} taints: {:?}{}", sym, taints, memory))
}
pub fn args_info<B: BV>(tid: usize, args: &[Val<B>], shared_state: &SharedState<B>, solver: &Solver<B>) {
let events = solver.trace().to_vec();
let references = EventReferences::from_events(&events);
for arg in args {
for sym in arg.symbolic_variables() {
let (taints, memory) = references.taints(sym, &events);
let taints: Vec<String> =
taints.iter().map(|(reg, _)| zencode::decode(shared_state.symtab.to_str(*reg))).collect();
let memory = if memory { ", MEMORY" } else { "" };
log_from!(tid, log::PROBE, &format!("Symbol {} taints: {:?}{}", sym, taints, memory))
}
}
}
pub fn call_info<B: BV>(f: Name, args: &[Val<B>], symtab: &Symtab) -> String {
let symbol = zencode::decode(symtab.to_str(f));
format!("Calling {}({:?})", symbol, args.iter().map(|arg| arg.to_string(symtab)).collect::<Vec<String>>())
}