Skip to content

Commit 49558b8

Browse files
committed
Replace calls to unwrap() in dwarf_import
1 parent 573b03c commit 49558b8

File tree

7 files changed

+427
-187
lines changed

7 files changed

+427
-187
lines changed

plugins/dwarf/dwarf_import/build.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,12 @@ fn main() {
33
.expect("DEP_BINARYNINJACORE_PATH not specified");
44

55
println!("cargo::rustc-link-lib=dylib=binaryninjacore");
6-
println!("cargo::rustc-link-search={}", link_path.to_str().unwrap());
6+
println!(
7+
"cargo::rustc-link-search={}",
8+
link_path
9+
.to_str()
10+
.expect("Failed to convert link path to string")
11+
);
712

813
#[cfg(target_os = "linux")]
914
{

plugins/dwarf/dwarf_import/src/die_handlers.rs

Lines changed: 141 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,23 @@ pub(crate) fn handle_enum<R: ReaderType>(
106106

107107
let mut enumeration_builder = EnumerationBuilder::new();
108108

109-
let mut tree = unit.entries_tree(Some(entry.offset())).unwrap();
110-
let mut children = tree.root().unwrap().children();
109+
let mut tree = match unit.entries_tree(Some(entry.offset())) {
110+
Ok(x) => x,
111+
Err(e) => {
112+
log::error!("Failed to get enum entry tree: {}", e);
113+
return None;
114+
}
115+
};
116+
117+
let tree_root = match tree.root() {
118+
Ok(x) => x,
119+
Err(e) => {
120+
log::error!("Failed to get enum entry tree root: {}", e);
121+
return None;
122+
}
123+
};
124+
125+
let mut children = tree_root.children();
111126
while let Ok(Some(child)) = children.next() {
112127
if child.entry().tag() == constants::DW_TAG_enumerator {
113128
let name = debug_info_builder_context.get_name(dwarf, unit, child.entry())?;
@@ -183,49 +198,32 @@ pub(crate) fn handle_pointer<R: ReaderType>(
183198
// ?DW_AT_data_location
184199
// * = Optional
185200

186-
if let Some(pointer_size) = get_size_as_usize(entry) {
187-
if let Some(entry_type_offset) = entry_type {
188-
let parent_type = debug_info_builder
189-
.get_type(entry_type_offset)
190-
.unwrap()
191-
.get_type();
192-
Some(Type::pointer_of_width(
193-
parent_type.as_ref(),
194-
pointer_size,
195-
false,
196-
false,
197-
Some(reference_type),
198-
))
199-
} else {
200-
Some(Type::pointer_of_width(
201-
Type::void().as_ref(),
202-
pointer_size,
203-
false,
204-
false,
205-
Some(reference_type),
206-
))
207-
}
208-
} else if let Some(entry_type_offset) = entry_type {
209-
let parent_type = debug_info_builder
201+
let pointer_size = match get_size_as_usize(entry) {
202+
Some(x) => x,
203+
None => debug_info_builder_context.default_address_size(),
204+
};
205+
206+
let target_type = match entry_type {
207+
Some(entry_type_offset) => debug_info_builder
210208
.get_type(entry_type_offset)
211-
.unwrap()
212-
.get_type();
213-
Some(Type::pointer_of_width(
214-
parent_type.as_ref(),
215-
debug_info_builder_context.default_address_size(),
216-
false,
217-
false,
218-
Some(reference_type),
219-
))
220-
} else {
221-
Some(Type::pointer_of_width(
222-
Type::void().as_ref(),
223-
debug_info_builder_context.default_address_size(),
224-
false,
225-
false,
226-
Some(reference_type),
227-
))
228-
}
209+
.or_else(|| {
210+
log::error!(
211+
"Failed to get pointer target type at entry offset {}",
212+
entry_type_offset
213+
);
214+
None
215+
})?
216+
.get_type(),
217+
None => Type::void(),
218+
};
219+
220+
Some(Type::pointer_of_width(
221+
target_type.as_ref(),
222+
pointer_size,
223+
false,
224+
false,
225+
Some(reference_type),
226+
))
229227
}
230228

231229
pub(crate) fn handle_array<R: ReaderType>(
@@ -246,35 +244,51 @@ pub(crate) fn handle_array<R: ReaderType>(
246244
// * = Optional
247245
// For multidimensional arrays, DW_TAG_subrange_type or DW_TAG_enumeration_type
248246

249-
if let Some(entry_type_offset) = entry_type {
250-
let parent_type = debug_info_builder
251-
.get_type(entry_type_offset)
252-
.unwrap()
253-
.get_type();
254-
255-
let mut tree = unit.entries_tree(Some(entry.offset())).unwrap();
256-
let mut children = tree.root().unwrap().children();
257-
258-
// TODO : This is currently applying the size in reverse order
259-
let mut result_type: Option<Ref<Type>> = None;
260-
while let Ok(Some(child)) = children.next() {
261-
if let Some(inner_type) = result_type {
262-
result_type = Some(Type::array(
263-
inner_type.as_ref(),
264-
get_subrange_size(child.entry()),
265-
));
266-
} else {
267-
result_type = Some(Type::array(
268-
parent_type.as_ref(),
269-
get_subrange_size(child.entry()),
270-
));
271-
}
247+
let entry_type_offset = entry_type?;
248+
let parent_type = debug_info_builder
249+
.get_type(entry_type_offset)
250+
.or_else(|| {
251+
log::error!(
252+
"Failed to get array member type at entry offset {}",
253+
entry_type_offset
254+
);
255+
None
256+
})?
257+
.get_type();
258+
259+
let mut tree = match unit.entries_tree(Some(entry.offset())) {
260+
Ok(x) => x,
261+
Err(e) => {
262+
log::error!("Failed to get array entry tree: {}", e);
263+
return None;
272264
}
265+
};
266+
let tree_root = match tree.root() {
267+
Ok(x) => x,
268+
Err(e) => {
269+
log::error!("Failed to get array entry tree root: {}", e);
270+
return None;
271+
}
272+
};
273+
let mut children = tree_root.children();
273274

274-
result_type.map_or(Some(Type::array(parent_type.as_ref(), 0)), Some)
275-
} else {
276-
None
275+
// TODO : This is currently applying the size in reverse order
276+
let mut result_type: Option<Ref<Type>> = None;
277+
while let Ok(Some(child)) = children.next() {
278+
if let Some(inner_type) = result_type {
279+
result_type = Some(Type::array(
280+
inner_type.as_ref(),
281+
get_subrange_size(child.entry()),
282+
));
283+
} else {
284+
result_type = Some(Type::array(
285+
parent_type.as_ref(),
286+
get_subrange_size(child.entry()),
287+
));
288+
}
277289
}
290+
291+
result_type.map_or(Some(Type::array(parent_type.as_ref(), 0)), Some)
278292
}
279293

280294
pub(crate) fn handle_function<R: ReaderType>(
@@ -327,8 +341,23 @@ pub(crate) fn handle_function<R: ReaderType>(
327341
let mut variable_arguments = false;
328342

329343
// Get all the children and populate
330-
let mut tree = unit.entries_tree(Some(entry.offset())).unwrap();
331-
let mut children = tree.root().unwrap().children();
344+
let mut tree = match unit.entries_tree(Some(entry.offset())) {
345+
Ok(x) => x,
346+
Err(e) => {
347+
log::error!("Failed to get function entry tree: {}", e);
348+
return None;
349+
}
350+
};
351+
352+
let tree_root = match tree.root() {
353+
Ok(x) => x,
354+
Err(e) => {
355+
log::error!("Failed to get function entry tree root: {}", e);
356+
return None;
357+
}
358+
};
359+
360+
let mut children = tree_root.children();
332361
while let Ok(Some(child)) = children.next() {
333362
if child.entry().tag() == constants::DW_TAG_formal_parameter {
334363
if let (Some(child_uid), Some(name)) = {
@@ -343,7 +372,16 @@ pub(crate) fn handle_function<R: ReaderType>(
343372
debug_info_builder_context.get_name(dwarf, unit, child.entry()),
344373
)
345374
} {
346-
let child_type = debug_info_builder.get_type(child_uid).unwrap().get_type();
375+
let child_type = debug_info_builder
376+
.get_type(child_uid)
377+
.or_else(|| {
378+
log::error!(
379+
"Failed to get function parameter type with uid {}",
380+
child_uid
381+
);
382+
None
383+
})?
384+
.get_type();
347385
parameters.push(FunctionParameter::new(child_type, name, None));
348386
}
349387
} else if child.entry().tag() == constants::DW_TAG_unspecified_parameters {
@@ -373,15 +411,22 @@ pub(crate) fn handle_const(
373411
// ?DW_AT_sibling
374412
// ?DW_AT_type
375413

376-
if let Some(entry_type_offset) = entry_type {
377-
let parent_type = debug_info_builder
414+
let target_type_builder = match entry_type {
415+
Some(entry_type_offset) => debug_info_builder
378416
.get_type(entry_type_offset)
379-
.unwrap()
380-
.get_type();
381-
Some((*parent_type).to_builder().set_const(true).finalize())
382-
} else {
383-
Some(TypeBuilder::void().set_const(true).finalize())
384-
}
417+
.or_else(|| {
418+
log::error!(
419+
"Failed to get const type with entry offset {}",
420+
entry_type_offset
421+
);
422+
None
423+
})?
424+
.get_type()
425+
.to_builder(),
426+
None => TypeBuilder::void(),
427+
};
428+
429+
Some(target_type_builder.set_const(true).finalize())
385430
}
386431

387432
pub(crate) fn handle_volatile(
@@ -396,13 +441,20 @@ pub(crate) fn handle_volatile(
396441
// ?DW_AT_sibling
397442
// ?DW_AT_type
398443

399-
if let Some(entry_type_offset) = entry_type {
400-
let parent_type = debug_info_builder
444+
let target_type_builder = match entry_type {
445+
Some(entry_type_offset) => debug_info_builder
401446
.get_type(entry_type_offset)
402-
.unwrap()
403-
.get_type();
404-
Some((*parent_type).to_builder().set_volatile(true).finalize())
405-
} else {
406-
Some(TypeBuilder::void().set_volatile(true).finalize())
407-
}
447+
.or_else(|| {
448+
log::error!(
449+
"Failed to get volatile type with entry offset {}",
450+
entry_type_offset
451+
);
452+
None
453+
})?
454+
.get_type()
455+
.to_builder(),
456+
None => TypeBuilder::void(),
457+
};
458+
459+
Some(target_type_builder.set_volatile(true).finalize())
408460
}

0 commit comments

Comments
 (0)