diff options
| author | Glenn Smith <glenn@vector35.com> | 2024-04-29 19:16:05 -0400 |
|---|---|---|
| committer | Glenn Smith <glenn@vector35.com> | 2024-06-04 14:37:49 -0400 |
| commit | 8173715404106919642746094513822041995675 (patch) | |
| tree | 1c14ec684c8150aa45d98315e15612574088c863 /rust/examples | |
| parent | 4585954404982498919160349545491853828464 (diff) | |
PDB: Ignore the formal vtable types (array of void function pointers)
They are conflicting with the demangler-generated real vtable types
Diffstat (limited to 'rust/examples')
| -rw-r--r-- | rust/examples/pdb-ng/src/type_parser.rs | 37 |
1 files changed, 29 insertions, 8 deletions
diff --git a/rust/examples/pdb-ng/src/type_parser.rs b/rust/examples/pdb-ng/src/type_parser.rs index dc23f2ff..f21a04fa 100644 --- a/rust/examples/pdb-ng/src/type_parser.rs +++ b/rust/examples/pdb-ng/src/type_parser.rs @@ -487,6 +487,33 @@ impl<'a, S: Source<'a> + 'a> PDBParserInstance<'a, S> { } } + // Also array of bare function pointers (often seen in vtables) + // These should not be marked confidently, as they don't actually know + // the types of their contents + + if ty.type_class() == TypeClass::ArrayTypeClass { + if let Ok(ptr) = ty.element_type() { + if ptr.contents.type_class() == TypeClass::PointerTypeClass { + if let Ok(fun) = ptr.contents.target() { + if fun.contents.type_class() == TypeClass::FunctionTypeClass + && fun + .contents + .parameters() + .map(|pars| pars.len()) + .unwrap_or(0) + == 0 + { + if let Ok(ret) = fun.contents.return_value() { + if ret.contents.type_class() == TypeClass::VoidTypeClass { + confidence = 0; + } + } + } + } + } + } + } + Ok(Some(Conf::new(ty, confidence))) } None => Ok(None), @@ -843,10 +870,7 @@ impl<'a, S: Source<'a> + 'a> PDBParserInstance<'a, S> { Type::structure(builder.finalize().as_ref()), max_confidence(), ), - name: bitfield_name( - last_bitfield_offset, - last_bitfield_idx, - ), + name: bitfield_name(last_bitfield_offset, last_bitfield_idx), offset: last_bitfield_offset, access: MemberAccess::PublicAccess, scope: MemberScope::NoScope, @@ -880,10 +904,7 @@ impl<'a, S: Source<'a> + 'a> PDBParserInstance<'a, S> { Type::structure(builder.finalize().as_ref()), max_confidence(), ), - name: bitfield_name( - last_bitfield_offset, - last_bitfield_idx, - ), + name: bitfield_name(last_bitfield_offset, last_bitfield_idx), offset: last_bitfield_offset, access: MemberAccess::PublicAccess, scope: MemberScope::NoScope, |
