Skip to content

Commit b70e92b

Browse files
committed
refactor in preparation for wasmtime upgrade
1 parent adac881 commit b70e92b

21 files changed

+391
-452
lines changed

src/analyses/call_analyzer.rs

+5-6
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
use crate::{analyses, ir, lattices, loaders};
22
use analyses::reaching_defs::ReachingDefnAnalyzer;
33
use analyses::{AbstractAnalyzer, AnalysisResult};
4-
use ir::types::{
5-
Binopcode, IRBlock, IRMap, MemArg, MemArgs, Stmt, Unopcode, ValSize, Value, X86Regs,
6-
};
7-
use ir::utils::{extract_stack_offset, is_stack_access};
4+
use ir::types::*;
5+
// use ir::utils::{extract_stack_offset, is_stack_access};
6+
use crate::ir::types::RegT;
87
use lattices::calllattice::{CallCheckLattice, CallCheckValue, CallCheckValueLattice};
98
use lattices::davlattice::DAV;
109
use lattices::reachingdefslattice::{LocIdx, ReachLattice};
@@ -387,8 +386,8 @@ impl CallAnalyzer {
387386
return CallCheckValueLattice {
388387
v: Some(TypeOf(reg)),
389388
};
390-
} else if is_stack_access(value) {
391-
let offset = extract_stack_offset(memargs);
389+
} else if value.is_stack_access() {
390+
let offset = memargs.extract_stack_offset();
392391
return in_state.stack.get(offset, memsize.into_bytes());
393392
}
394393
}

src/analyses/heap_analyzer.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use crate::ir::types::Stmt;
22
use crate::{analyses, ir, lattices, loaders};
33
use analyses::{AbstractAnalyzer, AnalysisResult};
4-
use ir::types::{Binopcode, MemArg, MemArgs, Unopcode, ValSize, Value, X86Regs};
5-
use ir::utils::{extract_stack_offset, is_stack_access};
4+
use ir::types::*;
5+
// use ir::utils::{extract_stack_offset, is_stack_access};
66
use lattices::heaplattice::{HeapLattice, HeapValue, HeapValueLattice};
77
use lattices::reachingdefslattice::LocIdx;
88
use lattices::{ConstLattice, VarState};
@@ -157,8 +157,8 @@ impl HeapAnalyzer {
157157
if is_globalbase_access(in_state, memargs) {
158158
return HeapValueLattice::new(GlobalsBase);
159159
}
160-
if is_stack_access(value) {
161-
let offset = extract_stack_offset(memargs);
160+
if value.is_stack_access() {
161+
let offset = memargs.extract_stack_offset();
162162
let v = in_state.stack.get(offset, memsize.into_bytes());
163163
return v;
164164
}

src/analyses/jump_analyzer.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1+
use crate::ir::types::RegT;
12
use crate::{analyses, ir, lattices, loaders};
23
use analyses::reaching_defs::ReachingDefnAnalyzer;
34
use analyses::{AbstractAnalyzer, AnalysisResult};
4-
use ir::types::{Binopcode, IRMap, MemArg, MemArgs, Unopcode, ValSize, Value, X86Regs};
5-
use ir::utils::get_rsp_offset;
5+
use ir::types::*;
66
use lattices::reachingdefslattice::{LocIdx, ReachLattice};
77
use lattices::switchlattice::{SwitchLattice, SwitchValue, SwitchValueLattice};
88
use lattices::{VarSlot, VarState};

src/analyses/locals_analyzer.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@ use std::collections::HashMap;
33
use std::collections::HashSet;
44

55
use analyses::{AbstractAnalyzer, AnalysisResult, CallAnalyzer};
6-
use ir::types::{Binopcode, FunType, IRMap, Stmt, ValSize, Value, VarIndex, X86Regs};
7-
use ir::utils::mk_value_i64;
6+
use ir::types::*;
87
use lattices::calllattice::CallCheckLattice;
98
use lattices::localslattice::*;
109
use lattices::mem_to_stack_offset;

src/analyses/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ mod jump_analyzer;
44
pub mod locals_analyzer;
55
pub mod reaching_defs;
66
mod stack_analyzer;
7-
use crate::ir::types::{Binopcode, IRBlock, IRMap, Stmt, Unopcode, Value};
7+
use crate::ir::types::*;
88
use crate::lattices::reachingdefslattice::LocIdx;
99
use crate::lattices::{Lattice, VarState};
1010
use std::collections::{HashMap, VecDeque};

src/analyses/reaching_defs.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::{analyses, ir, lattices, loaders};
22
use analyses::{run_worklist, AbstractAnalyzer, AnalysisResult};
3-
use ir::types::{Binopcode, IRMap, Stmt, Unopcode, ValSize, X86Regs};
3+
use ir::types::*;
44
use lattices::reachingdefslattice::{loc, singleton, LocIdx, ReachLattice};
55
use lattices::VarState;
66
use loaders::types::VwMetadata;

src/analyses/stack_analyzer.rs

+8-9
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use crate::{analyses, ir, lattices};
22
use analyses::AbstractAnalyzer;
3-
use ir::types::{Binopcode, Stmt, Unopcode};
4-
use ir::utils::{get_imm_offset, is_rbp, is_rsp};
3+
use ir::types::*;
54
use lattices::reachingdefslattice::LocIdx;
65
use lattices::stackgrowthlattice::StackGrowthLattice;
76

@@ -15,40 +14,40 @@ impl AbstractAnalyzer<StackGrowthLattice> for StackAnalyzer {
1514
fn aexec(&self, in_state: &mut StackGrowthLattice, ir_instr: &Stmt, loc_idx: &LocIdx) -> () {
1615
match ir_instr {
1716
Stmt::Clear(dst, _) => {
18-
if is_rsp(dst) {
17+
if dst.is_rsp() {
1918
*in_state = Default::default()
2019
}
2120
}
22-
Stmt::Unop(Unopcode::Mov, dst, src) if is_rsp(dst) && is_rbp(src) => {
21+
Stmt::Unop(Unopcode::Mov, dst, src) if dst.is_rsp() && src.is_rbp() => {
2322
if let Some((_, probestack, rbp_stackgrowth)) = in_state.v {
2423
*in_state = StackGrowthLattice {
2524
v: Some((rbp_stackgrowth, probestack, rbp_stackgrowth)),
2625
};
2726
}
2827
}
29-
Stmt::Unop(Unopcode::Mov, dst, src) if is_rbp(dst) && is_rsp(src) => {
28+
Stmt::Unop(Unopcode::Mov, dst, src) if dst.is_rbp() && src.is_rsp() => {
3029
if let Some((stackgrowth, probestack, _)) = in_state.v {
3130
*in_state = StackGrowthLattice {
3231
v: Some((stackgrowth, probestack, stackgrowth)),
3332
};
3433
}
3534
}
3635
Stmt::Unop(_, dst, _) => {
37-
if is_rsp(dst) {
36+
if dst.is_rsp() {
3837
*in_state = Default::default()
3938
}
4039
}
4140
Stmt::Binop(Binopcode::Cmp, _, _, _) => (),
4241
Stmt::Binop(Binopcode::Test, _, _, _) => (),
4342
Stmt::Binop(opcode, dst, src1, src2) => {
44-
if is_rsp(dst) {
45-
if is_rsp(src1) {
43+
if dst.is_rsp() {
44+
if src1.is_rsp() {
4645
log::debug!(
4746
"Processing stack instruction: 0x{:x} {:?}",
4847
loc_idx.addr,
4948
ir_instr
5049
);
51-
let offset = get_imm_offset(src2);
50+
let offset = src2.as_imm_val();
5251
if let Some((x, probestack, rbp)) = in_state.v {
5352
match opcode {
5453
Binopcode::Add => {

src/bin/veriwasm.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ fn main() {
7373
ExecutableType::from_str(matches.value_of("executable type").unwrap_or("lucet")).unwrap();
7474
let arch = VwArch::from_str(matches.value_of("architecture").unwrap_or("x64")).unwrap();
7575

76-
let has_output = if output_path == "" { false } else { true };
76+
let has_output = output_path != "";
7777

7878
let active_passes = PassConfig {
7979
stack: !disable_stack_checks,

src/checkers/call_checker.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::{analyses, checkers, ir, lattices};
22
use analyses::{AbstractAnalyzer, AnalysisResult, CallAnalyzer};
33
use checkers::Checker;
4-
use ir::types::{IRMap, MemArg, MemArgs, Stmt, ValSize, Value};
4+
use ir::types::*;
55
use lattices::calllattice::{CallCheckLattice, CallCheckValue};
66
use lattices::davlattice::DAV;
77
use lattices::reachingdefslattice::LocIdx;

src/checkers/heap_checker.rs

+11-11
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::analyses::{AbstractAnalyzer, AnalysisResult, HeapAnalyzer};
22
use crate::checkers::Checker;
3-
use crate::ir::types::{IRMap, MemArg, MemArgs, Stmt, ValSize, Value, X86Regs};
4-
use crate::ir::utils::{is_mem_access, is_stack_access};
3+
use crate::ir::types::*;
4+
// use crate::ir::utils::{is_mem_access, is_stack_access};
55
use crate::lattices::heaplattice::{HeapLattice, HeapValue};
66
use crate::lattices::reachingdefslattice::LocIdx;
77
use crate::loaders::utils::is_libcall;
@@ -94,32 +94,32 @@ impl Checker<HeapLattice> for HeapChecker<'_> {
9494
},
9595
//2. Check that all load and store are safe
9696
Stmt::Unop(_, dst, src) => {
97-
if is_mem_access(dst) && !self.check_mem_access(state, dst, loc_idx) {
97+
if dst.is_mem() && !self.check_mem_access(state, dst, loc_idx) {
9898
return false;
9999
}
100100
//stack read: probestack <= stackgrowth + c < 8K
101-
if is_mem_access(src) && !self.check_mem_access(state, src, loc_idx) {
101+
if src.is_mem() && !self.check_mem_access(state, src, loc_idx) {
102102
return false;
103103
}
104104
}
105105

106106
Stmt::Binop(_, dst, src1, src2) => {
107-
if is_mem_access(dst) && !self.check_mem_access(state, dst, loc_idx) {
107+
if dst.is_mem() && !self.check_mem_access(state, dst, loc_idx) {
108108
return false;
109109
}
110-
if is_mem_access(src1) && !self.check_mem_access(state, src1, loc_idx) {
110+
if src1.is_mem() && !self.check_mem_access(state, src1, loc_idx) {
111111
return false;
112112
}
113-
if is_mem_access(src2) && !self.check_mem_access(state, src2, loc_idx) {
113+
if src2.is_mem() && !self.check_mem_access(state, src2, loc_idx) {
114114
return false;
115115
}
116116
}
117117
Stmt::Clear(dst, srcs) => {
118-
if is_mem_access(dst) && !self.check_mem_access(state, dst, loc_idx) {
118+
if dst.is_mem() && !self.check_mem_access(state, dst, loc_idx) {
119119
return false;
120120
}
121121
for src in srcs {
122-
if is_mem_access(src) && !self.check_mem_access(state, src, loc_idx) {
122+
if src.is_mem() && !self.check_mem_access(state, src, loc_idx) {
123123
return false;
124124
}
125125
}
@@ -302,11 +302,11 @@ impl HeapChecker<'_> {
302302

303303
fn check_mem_access(&self, state: &HeapLattice, access: &Value, loc_idx: &LocIdx) -> bool {
304304
// Case 1: its a stack access
305-
if is_stack_access(access) {
305+
if access.is_stack_access() {
306306
return true;
307307
}
308308
// Case 2: it is a frame slot (RBP-based) access
309-
if is_frame_access(access) {
309+
if access.is_frame_access() {
310310
return true;
311311
}
312312
// Case 3: it is an access based at a constant loaded from

src/checkers/jump_resolver.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::{analyses, ir, lattices};
22
use analyses::{AbstractAnalyzer, AnalysisResult, SwitchAnalyzer};
3-
use ir::types::{IRMap, Stmt, Value};
3+
use ir::types::*;
44
use lattices::reachingdefslattice::LocIdx;
55
use lattices::switchlattice::{SwitchLattice, SwitchValue, SwitchValueLattice};
66
use std::collections::HashMap;

src/checkers/locals_checker.rs

+2-12
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@ use std::convert::TryFrom;
55
use analyses::locals_analyzer::LocalsAnalyzer;
66
use analyses::{AbstractAnalyzer, AnalysisResult};
77
use checkers::Checker;
8-
use ir::types::{FunType, IRMap, MemArgs, Stmt, ValSize, Value, VarIndex, X86Regs};
9-
use ir::utils::is_stack_access;
8+
use ir::types::*;
109
use lattices::localslattice::{LocalsLattice, SlotVal};
1110
use lattices::reachingdefslattice::LocIdx;
1211
use loaders::utils::is_libcall;
@@ -31,16 +30,7 @@ pub fn check_locals(
3130
}
3231

3332
fn is_noninit_illegal(v: &Value) -> bool {
34-
match v {
35-
Value::Mem(memsize, memargs) => !is_stack_access(v),
36-
Value::Reg(reg_num, _) => false,
37-
// {
38-
// *reg_num != Rsp && *reg_num != Rbp && !(X86Regs::is_flag(*reg_num))
39-
// },
40-
// false,
41-
Value::Imm(_, _, _) => false, //imm are always "init"
42-
Value::RIPConst => false,
43-
}
33+
v.is_mem() && !v.is_stack_access()
4434
}
4535

4636
impl LocalsChecker<'_> {

src/checkers/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::{analyses, ir, lattices};
22
use analyses::AnalysisResult;
3-
use ir::types::{IRMap, Stmt};
3+
use ir::types::*;
44
use itertools::Itertools;
55
use lattices::reachingdefslattice::LocIdx;
66
use lattices::Lattice;

src/checkers/stack_checker.rs

+9-10
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@ use crate::{analyses, checkers, ir, lattices};
22
use analyses::StackAnalyzer;
33
use analyses::{AbstractAnalyzer, AnalysisResult};
44
use checkers::Checker;
5-
use ir::types::{IRMap, MemArgs, Stmt, Value};
6-
use ir::utils::{get_imm_mem_offset, is_bp_access, is_stack_access};
5+
use ir::types::*;
76
use lattices::reachingdefslattice::LocIdx;
87
use lattices::stackgrowthlattice::StackGrowthLattice;
98

@@ -61,7 +60,7 @@ impl Checker<StackGrowthLattice> for StackChecker<'_> {
6160
Stmt::Unop(_, dst, src) =>
6261
// stack write: probestack <= stackgrowth + c < 0
6362
{
64-
if is_stack_access(dst) {
63+
if dst.is_stack_access() {
6564
if !self.check_stack_write(state, dst) {
6665
log::debug!(
6766
"check_stack_write failed: access = {:?} state = {:?}",
@@ -71,7 +70,7 @@ impl Checker<StackGrowthLattice> for StackChecker<'_> {
7170
return false;
7271
}
7372
}
74-
if is_bp_access(dst) {
73+
if dst.is_frame_access() {
7574
if !self.check_bp_write(state, dst) {
7675
log::debug!(
7776
"check_bp_write failed: access = {:?} state = {:?}",
@@ -82,7 +81,7 @@ impl Checker<StackGrowthLattice> for StackChecker<'_> {
8281
}
8382
}
8483
//stack read: probestack <= stackgrowth + c < 8K
85-
if is_stack_access(src) {
84+
if src.is_stack_access() {
8685
if !self.check_stack_read(state, src) {
8786
log::debug!(
8887
"check_stack_read failed: access = {:?} state = {:?}",
@@ -91,7 +90,7 @@ impl Checker<StackGrowthLattice> for StackChecker<'_> {
9190
);
9291
return false;
9392
}
94-
} else if is_bp_access(src) {
93+
} else if src.is_frame_access() {
9594
if !self.check_bp_read(state, src) {
9695
log::debug!(
9796
"check_bp_read failed: access = {:?} state = {:?}",
@@ -128,7 +127,7 @@ impl StackChecker<'_> {
128127
&& (state.get_stackgrowth().unwrap() < 8096)
129128
}
130129
MemArgs::Mem2Args(_memarg1, memarg2) => {
131-
let offset = get_imm_mem_offset(memarg2);
130+
let offset = memarg2.to_imm();
132131
return (-state.get_probestack().unwrap()
133132
<= state.get_stackgrowth().unwrap() + offset)
134133
&& (state.get_stackgrowth().unwrap() + offset < 8096);
@@ -147,7 +146,7 @@ impl StackChecker<'_> {
147146
&& (state.get_rbp().unwrap() < 8096)
148147
}
149148
MemArgs::Mem2Args(_memarg1, memarg2) => {
150-
let offset = get_imm_mem_offset(memarg2);
149+
let offset = memarg2.to_imm();
151150
return (-state.get_probestack().unwrap() <= state.get_rbp().unwrap() + offset)
152151
&& (state.get_rbp().unwrap() + offset < 8096);
153152
}
@@ -165,7 +164,7 @@ impl StackChecker<'_> {
165164
&& (state.get_stackgrowth().unwrap() < 0);
166165
}
167166
MemArgs::Mem2Args(_memarg1, memarg2) => {
168-
let offset = get_imm_mem_offset(memarg2);
167+
let offset = memarg2.to_imm();
169168
return (-state.get_probestack().unwrap()
170169
<= state.get_stackgrowth().unwrap() + offset)
171170
&& (state.get_stackgrowth().unwrap() + offset < 0);
@@ -184,7 +183,7 @@ impl StackChecker<'_> {
184183
&& (state.get_rbp().unwrap() < 0);
185184
}
186185
MemArgs::Mem2Args(_memarg1, memarg2) => {
187-
let offset = get_imm_mem_offset(memarg2);
186+
let offset = memarg2.to_imm();
188187
return (-state.get_probestack().unwrap() <= state.get_rbp().unwrap() + offset)
189188
&& (state.get_rbp().unwrap() + offset < 0);
190189
}

src/ir/cfg.rs

+17-2
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,27 @@ use analyses::reaching_defs::ReachingDefnAnalyzer;
44
use analyses::{run_worklist, SwitchAnalyzer};
55
use checkers::resolve_jumps;
66
use ir::lift_cfg;
7-
use ir::types::IRMap;
8-
use ir::utils::has_indirect_jumps;
7+
use ir::types::*;
98
use loaders::types::VwModule;
109
use yaxpeax_core::analyses::control_flow::{get_cfg, VW_CFG};
1110
use yaxpeax_core::arch::x86_64::MergedContextTable;
1211

12+
pub fn has_indirect_jumps(irmap: &IRMap) -> bool {
13+
for (_block_addr, ir_block) in irmap {
14+
for (_addr, ir_stmts) in ir_block {
15+
for (_idx, ir_stmt) in ir_stmts.iter().enumerate() {
16+
match ir_stmt {
17+
Stmt::Branch(_, Value::Reg(_, _)) | Stmt::Branch(_, Value::Mem(_, _)) => {
18+
return true
19+
}
20+
_ => (),
21+
}
22+
}
23+
}
24+
}
25+
false
26+
}
27+
1328
fn try_resolve_jumps(
1429
module: &VwModule,
1530
contexts: &MergedContextTable,

src/ir/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
mod aarch64;
22
mod cfg;
33
pub mod types;
4-
pub mod utils;
4+
//pub mod utils;
55
mod x64;
66

77
pub use self::cfg::fully_resolved_cfg;

0 commit comments

Comments
 (0)