Skip to content

Commit eabcd1c

Browse files
committed
Deprecate some Rust MediumLevelILFunction methods in favor of Function implementations
1 parent 4c1c871 commit eabcd1c

File tree

3 files changed

+118
-53
lines changed

3 files changed

+118
-53
lines changed

plugins/warp/src/plugin/workflow.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ pub fn insert_workflow() -> Result<(), ()> {
200200
decl_instr.variable_for_stack_location_after(offset)
201201
}
202202
};
203-
if mlil.is_var_user_defined(&decl_var) {
203+
if function.is_var_user_defined(&decl_var) {
204204
// Internally, analysis will just assign user vars to auto vars and consult only that.
205205
// So we must skip if there is a user-defined var at the decl.
206206
continue;
@@ -217,7 +217,7 @@ pub fn insert_workflow() -> Result<(), ()> {
217217
let decl_name = variable
218218
.name
219219
.unwrap_or_else(|| function.variable_name(&decl_var));
220-
mlil.create_auto_var(&decl_var, &decl_ty, &decl_name, false)
220+
function.create_auto_var(&decl_var, &decl_ty, &decl_name, false)
221221
}
222222
}
223223
}

rust/src/function.rs

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1688,6 +1688,102 @@ impl Function {
16881688
unsafe { BNSetUserInstructionHighlight(self.handle, arch.handle, addr, color.into()) }
16891689
}
16901690

1691+
pub fn create_user_stack_var<'a, C: Into<Conf<&'a Type>>>(
1692+
&self,
1693+
offset: i64,
1694+
var_type: C,
1695+
name: &str,
1696+
) {
1697+
let mut owned_raw_var_ty = Conf::<&Type>::into_raw(var_type.into());
1698+
let name = name.to_cstr();
1699+
unsafe {
1700+
BNCreateUserStackVariable(
1701+
self.handle,
1702+
offset,
1703+
&mut owned_raw_var_ty,
1704+
name.as_ptr(),
1705+
)
1706+
}
1707+
}
1708+
1709+
pub fn delete_user_stack_var(&self, offset: i64) {
1710+
unsafe { BNDeleteUserStackVariable(self.handle, offset) }
1711+
}
1712+
1713+
pub fn create_user_var<'a, C: Into<Conf<&'a Type>>>(
1714+
&self,
1715+
var: &Variable,
1716+
var_type: C,
1717+
name: &str,
1718+
ignore_disjoint_uses: bool,
1719+
) {
1720+
let raw_var = BNVariable::from(var);
1721+
let mut owned_raw_var_ty = Conf::<&Type>::into_raw(var_type.into());
1722+
let name = name.to_cstr();
1723+
unsafe {
1724+
BNCreateUserVariable(
1725+
self.handle,
1726+
&raw_var,
1727+
&mut owned_raw_var_ty,
1728+
name.as_ref().as_ptr() as *const _,
1729+
ignore_disjoint_uses,
1730+
)
1731+
}
1732+
}
1733+
1734+
pub fn delete_user_var(&self, var: &Variable) {
1735+
let raw_var = BNVariable::from(var);
1736+
unsafe { BNDeleteUserVariable(self.handle, &raw_var) }
1737+
}
1738+
1739+
pub fn is_var_user_defined(&self, var: &Variable) -> bool {
1740+
let raw_var = BNVariable::from(var);
1741+
unsafe { BNIsVariableUserDefined(self.handle, &raw_var) }
1742+
}
1743+
1744+
pub fn create_auto_stack_var<'a, T: Into<Conf<&'a Type>>>(
1745+
&self,
1746+
offset: i64,
1747+
var_type: T,
1748+
name: &str,
1749+
) {
1750+
let mut owned_raw_var_ty = Conf::<&Type>::into_raw(var_type.into());
1751+
let name = name.to_cstr();
1752+
unsafe {
1753+
BNCreateAutoStackVariable(
1754+
self.handle,
1755+
offset,
1756+
&mut owned_raw_var_ty,
1757+
name.as_ptr(),
1758+
)
1759+
}
1760+
}
1761+
1762+
pub fn delete_auto_stack_var(&self, offset: i64) {
1763+
unsafe { BNDeleteAutoStackVariable(self.handle, offset) }
1764+
}
1765+
1766+
pub fn create_auto_var<'a, C: Into<Conf<&'a Type>>>(
1767+
&self,
1768+
var: &Variable,
1769+
var_type: C,
1770+
name: &str,
1771+
ignore_disjoint_uses: bool,
1772+
) {
1773+
let raw_var = BNVariable::from(var);
1774+
let mut owned_raw_var_ty = Conf::<&Type>::into_raw(var_type.into());
1775+
let name = name.to_cstr();
1776+
unsafe {
1777+
BNCreateAutoVariable(
1778+
self.handle,
1779+
&raw_var,
1780+
&mut owned_raw_var_ty,
1781+
name.as_ptr(),
1782+
ignore_disjoint_uses,
1783+
)
1784+
}
1785+
}
1786+
16911787
/// return the address, if any, of the instruction that contains the
16921788
/// provided address
16931789
pub fn instruction_containing_address(

rust/src/medium_level_il/function.rs

Lines changed: 20 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ use crate::disassembly::DisassemblySettings;
1313
use crate::flowgraph::FlowGraph;
1414
use crate::function::{Function, Location};
1515
use crate::rc::{Array, CoreArrayProvider, CoreArrayProviderInner, Ref, RefCountable};
16-
use crate::string::IntoCStr;
1716
use crate::types::Type;
1817
use crate::variable::{PossibleValueSet, RegisterValue, SSAVariable, UserVariableValue, Variable};
1918

@@ -117,57 +116,42 @@ impl MediumLevelILFunction {
117116
unsafe { Array::new(blocks, count, context) }
118117
}
119118

119+
#[deprecated = "Use `Function::create_user_stack_var` instead"]
120120
pub fn create_user_stack_var<'a, C: Into<Conf<&'a Type>>>(
121121
&self,
122122
offset: i64,
123123
var_type: C,
124124
name: &str,
125125
) {
126-
let mut owned_raw_var_ty = Conf::<&Type>::into_raw(var_type.into());
127-
let name = name.to_cstr();
128-
unsafe {
129-
BNCreateUserStackVariable(
130-
self.function().handle,
131-
offset,
132-
&mut owned_raw_var_ty,
133-
name.as_ptr(),
134-
)
135-
}
126+
self.function()
127+
.create_user_stack_var(offset, var_type, name)
136128
}
137129

130+
#[deprecated = "Use `Function::delete_user_stack_var` instead"]
138131
pub fn delete_user_stack_var(&self, offset: i64) {
139-
unsafe { BNDeleteUserStackVariable(self.function().handle, offset) }
132+
self.function().delete_user_stack_var(offset)
140133
}
141134

135+
#[deprecated = "Use `Function::create_user_var` instead"]
142136
pub fn create_user_var<'a, C: Into<Conf<&'a Type>>>(
143137
&self,
144138
var: &Variable,
145139
var_type: C,
146140
name: &str,
147141
ignore_disjoint_uses: bool,
148142
) {
149-
let raw_var = BNVariable::from(var);
150-
let mut owned_raw_var_ty = Conf::<&Type>::into_raw(var_type.into());
151-
let name = name.to_cstr();
152-
unsafe {
153-
BNCreateUserVariable(
154-
self.function().handle,
155-
&raw_var,
156-
&mut owned_raw_var_ty,
157-
name.as_ref().as_ptr() as *const _,
158-
ignore_disjoint_uses,
159-
)
160-
}
143+
self.function()
144+
.create_user_var(var, var_type, name, ignore_disjoint_uses)
161145
}
162146

147+
#[deprecated = "Use `Function::delete_user_var` instead"]
163148
pub fn delete_user_var(&self, var: &Variable) {
164-
let raw_var = BNVariable::from(var);
165-
unsafe { BNDeleteUserVariable(self.function().handle, &raw_var) }
149+
self.function().delete_user_var(var)
166150
}
167151

152+
#[deprecated = "Use `Function::is_var_user_defined` instead"]
168153
pub fn is_var_user_defined(&self, var: &Variable) -> bool {
169-
let raw_var = BNVariable::from(var);
170-
unsafe { BNIsVariableUserDefined(self.function().handle, &raw_var) }
154+
self.function().is_var_user_defined(var)
171155
}
172156

173157
/// Allows the user to specify a PossibleValueSet value for an MLIL
@@ -261,47 +245,32 @@ impl MediumLevelILFunction {
261245
Ok(())
262246
}
263247

248+
#[deprecated = "Use `Function::create_auto_stack_var` instead"]
264249
pub fn create_auto_stack_var<'a, T: Into<Conf<&'a Type>>>(
265250
&self,
266251
offset: i64,
267252
var_type: T,
268253
name: &str,
269254
) {
270-
let mut owned_raw_var_ty = Conf::<&Type>::into_raw(var_type.into());
271-
let name = name.to_cstr();
272-
unsafe {
273-
BNCreateAutoStackVariable(
274-
self.function().handle,
275-
offset,
276-
&mut owned_raw_var_ty,
277-
name.as_ptr(),
278-
)
279-
}
255+
self.function()
256+
.create_auto_stack_var(offset, var_type, name)
280257
}
281258

259+
#[deprecated = "Use `Function::delete_auto_stack_var` instead"]
282260
pub fn delete_auto_stack_var(&self, offset: i64) {
283-
unsafe { BNDeleteAutoStackVariable(self.function().handle, offset) }
261+
self.function().delete_auto_stack_var(offset)
284262
}
285263

264+
#[deprecated = "Use `Function::create_auto_var` instead"]
286265
pub fn create_auto_var<'a, C: Into<Conf<&'a Type>>>(
287266
&self,
288267
var: &Variable,
289268
var_type: C,
290269
name: &str,
291270
ignore_disjoint_uses: bool,
292271
) {
293-
let raw_var = BNVariable::from(var);
294-
let mut owned_raw_var_ty = Conf::<&Type>::into_raw(var_type.into());
295-
let name = name.to_cstr();
296-
unsafe {
297-
BNCreateAutoVariable(
298-
self.function().handle,
299-
&raw_var,
300-
&mut owned_raw_var_ty,
301-
name.as_ptr(),
302-
ignore_disjoint_uses,
303-
)
304-
}
272+
self.function()
273+
.create_auto_var(var, var_type, name, ignore_disjoint_uses)
305274
}
306275

307276
/// Returns a list of ILReferenceSource objects (IL xrefs or cross-references)

0 commit comments

Comments
 (0)