MCPcopy Create free account
hub / github.com/Vector35/binaryninja-api / resolve_struct_groups

Function resolve_struct_groups

plugins/pdb-ng/src/struct_grouper.rs:439–488  ·  view source on GitHub ↗
(members: Vec<MemberSize>)

Source from the content-addressed store, hash-verified

437}
438
439fn resolve_struct_groups(members: Vec<MemberSize>) -> Result<Vec<ResolvedGroup>> {
440 // See if we care
441 let mut has_overlapping = false;
442 let mut last_end = 0;
443 let mut max_width = 0;
444 for member in &members {
445 if member.offset < last_end {
446 has_overlapping = true;
447 }
448 last_end = member.offset + member.width;
449 max_width = max_width.max(member.offset + member.width);
450 }
451
452 // TODO: has overlapping is probably failing.
453 if !has_overlapping {
454 // Nothing overlaps, just add em directly
455 return Ok(members
456 .into_iter()
457 .map(|member| ResolvedGroup::Single(member.index))
458 .collect());
459 }
460
461 // Yes overlapping
462
463 let mut groups = WorkingStruct {
464 index: None,
465 offset: 0,
466 width: max_width,
467 is_union: false,
468 children: vec![],
469 };
470 for &member in &members {
471 let member_group = WorkingStruct {
472 index: Some(member.index),
473 offset: member.offset,
474 width: member.width,
475 is_union: false,
476 children: vec![],
477 };
478 groups.insert(member_group, 0)?;
479
480 log(|| format!("GROUPS: {:#x?}", groups));
481 }
482
483 Ok(groups
484 .children
485 .into_iter()
486 .map(|child| child.to_resolved())
487 .collect())
488}
489
490#[test]
491fn test_trivial() {

Callers 1

group_structureFunction · 0.85

Calls 5

mapMethod · 0.80
to_resolvedMethod · 0.80
logFunction · 0.70
into_iterMethod · 0.45
insertMethod · 0.45

Tested by

no test coverage detected