From c00feac9feedd37491371035959687cd61df2d20 Mon Sep 17 00:00:00 2001 From: ghizard <50744617+ghizard@users.noreply.github.com> Date: Mon, 22 Mar 2021 10:54:55 -0400 Subject: [PATCH] GP-791 PDB Universal constructor return undefined --- .../pdbreader/type/AbstractMemberFunctionMsType.java | 8 ++++++++ .../pdb2/pdbreader/type/FunctionMsAttributes.java | 4 ++++ .../pdbapplicator/AbstractFunctionTypeApplier.java | 12 ++++++++++++ .../pdb/pdbapplicator/MemberFunctionTypeApplier.java | 8 ++++++-- 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/Ghidra/Features/PDB/src/main/java/ghidra/app/util/bin/format/pdb2/pdbreader/type/AbstractMemberFunctionMsType.java b/Ghidra/Features/PDB/src/main/java/ghidra/app/util/bin/format/pdb2/pdbreader/type/AbstractMemberFunctionMsType.java index ea8ff4a9ad..662cb70cc6 100644 --- a/Ghidra/Features/PDB/src/main/java/ghidra/app/util/bin/format/pdb2/pdbreader/type/AbstractMemberFunctionMsType.java +++ b/Ghidra/Features/PDB/src/main/java/ghidra/app/util/bin/format/pdb2/pdbreader/type/AbstractMemberFunctionMsType.java @@ -90,6 +90,14 @@ public abstract class AbstractMemberFunctionMsType extends AbstractMsType { return functionAttributes; } + /** + * Returns if known to be a constructor. + * @return true if constructor. + */ + public boolean isConstructor() { + return functionAttributes.isConstructor(); + } + /** * Returns the number of parameters to the function. * @return The number of parameters. diff --git a/Ghidra/Features/PDB/src/main/java/ghidra/app/util/bin/format/pdb2/pdbreader/type/FunctionMsAttributes.java b/Ghidra/Features/PDB/src/main/java/ghidra/app/util/bin/format/pdb2/pdbreader/type/FunctionMsAttributes.java index a558494c34..6343728650 100644 --- a/Ghidra/Features/PDB/src/main/java/ghidra/app/util/bin/format/pdb2/pdbreader/type/FunctionMsAttributes.java +++ b/Ghidra/Features/PDB/src/main/java/ghidra/app/util/bin/format/pdb2/pdbreader/type/FunctionMsAttributes.java @@ -58,4 +58,8 @@ public class FunctionMsAttributes extends AbstractParsableItem { isInstanceConstructorOfClassWithVirtualBases = ((attributes & 0x0001) == 0x0001); } + boolean isConstructor() { + return isInstanceConstructor || isInstanceConstructorOfClassWithVirtualBases; + } + } diff --git a/Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/pdbapplicator/AbstractFunctionTypeApplier.java b/Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/pdbapplicator/AbstractFunctionTypeApplier.java index 7c2af2d121..3dbb8dca93 100644 --- a/Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/pdbapplicator/AbstractFunctionTypeApplier.java +++ b/Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/pdbapplicator/AbstractFunctionTypeApplier.java @@ -121,6 +121,14 @@ public abstract class AbstractFunctionTypeApplier extends MsTypeApplier { */ protected abstract RecordNumber getArgListRecordNumber(); + /** + * Returns if known to be a constructor. + * @return true if constructor. + */ + protected boolean isConstructor() { + return false; + } + /** * Method to create the {@link DataType} based upon the type indices of the calling * convention, return type, and arguments list. @@ -203,6 +211,10 @@ public abstract class AbstractFunctionTypeApplier extends MsTypeApplier { private boolean setReturnType() { + if (isConstructor()) { + return false; + } + DataType returnDataType = returnApplier.getDataType(); if (returnDataType == null) { applicator.appendLogMsg("Return type is null in " + functionDefinition.getName()); diff --git a/Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/pdbapplicator/MemberFunctionTypeApplier.java b/Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/pdbapplicator/MemberFunctionTypeApplier.java index 681d628987..d659b94cf9 100644 --- a/Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/pdbapplicator/MemberFunctionTypeApplier.java +++ b/Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/pdbapplicator/MemberFunctionTypeApplier.java @@ -75,6 +75,11 @@ public class MemberFunctionTypeApplier extends AbstractFunctionTypeApplier { return ((AbstractMemberFunctionMsType) msType).getArgListRecordNumber(); } + @Override + protected boolean isConstructor() { + return ((AbstractMemberFunctionMsType) msType).isConstructor(); + } + @Override void apply() throws PdbException, CancelledException { predefineClasses(); @@ -175,8 +180,7 @@ public class MemberFunctionTypeApplier extends AbstractFunctionTypeApplier { // } private MsTypeApplier getThisPointerApplier(AbstractMemberFunctionMsType procType) { - MsTypeApplier applier = - applicator.getTypeApplier(procType.getThisPointerRecordNumber()); + MsTypeApplier applier = applicator.getTypeApplier(procType.getThisPointerRecordNumber()); // if ((applier instanceof PrimitiveTypeApplier && // ((PrimitiveTypeApplier) applier).isNoType())) {