From bb77d3cda9f92a2cdce6abf5ed7969c962934da6 Mon Sep 17 00:00:00 2001 From: dragonmacher <48328597+dragonmacher@users.noreply.github.com> Date: Wed, 22 Jul 2020 16:50:23 -0400 Subject: [PATCH] GT-3646 - Demangler - Fixed DemangledVariable to not have duplicate namespace entries returned from getNamespaceString() --- .../app/util/demangler/DemangledFunction.java | 1 - .../app/util/demangler/DemangledLambda.java | 5 -- .../app/util/demangler/DemangledObject.java | 6 +- .../app/util/demangler/DemangledString.java | 2 +- .../app/util/demangler/DemangledThunk.java | 66 ------------------- .../app/util/demangler/DemangledVariable.java | 16 +---- .../demangler/GnuDemanglerParserTest.java | 21 ++++++ 7 files changed, 24 insertions(+), 93 deletions(-) diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledFunction.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledFunction.java index ec4e6b8b5a..245492c234 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledFunction.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledFunction.java @@ -207,7 +207,6 @@ public class DemangledFunction extends DemangledObject { if (!isTypeCast()) { buffer.append(returnType == null ? "" : returnType.getSignature() + " "); } -// buffer.append(returnType == null ? "" : returnType.toSignature() + " "); } buffer.append(callingConvention == null ? "" : callingConvention + " "); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledLambda.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledLambda.java index 6d8ec51af6..79c02628cd 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledLambda.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledLambda.java @@ -24,11 +24,6 @@ public class DemangledLambda extends DemangledFunction { super(mangled, originalDemangled, name); } - @Override - public String getNamespaceName() { - return getName(); - } - @Override public String toString() { return getName(); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledObject.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledObject.java index c4e47fb5a9..2da0ee5232 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledObject.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledObject.java @@ -243,13 +243,9 @@ public abstract class DemangledObject implements Demangled { return getSignature(false); } - /** - * Returns a signature that contains only the name (and parameter list for functions) - * @return the signature - */ @Override public String getNamespaceName() { - return getSignature(false); + return getName(); } /** diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledString.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledString.java index 9d0399a7ad..e19dfe975d 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledString.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledString.java @@ -50,7 +50,7 @@ public class DemangledString extends DemangledObject { @Override public String getSignature(boolean format) { - StringBuffer buffer = new StringBuffer(); + StringBuilder buffer = new StringBuilder(); if (specialPrefix != null) { buffer.append(specialPrefix); } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledThunk.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledThunk.java index 5c54b95fdd..3497838956 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledThunk.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledThunk.java @@ -197,70 +197,4 @@ public class DemangledThunk extends DemangledObject { return program.getFunctionManager().getFunctionAt(addr); } -// private Function createAndThunkUnknownExternalFunction(Function function) { -// -// Program program = function.getProgram(); -// ExternalManager extMgr = program.getExternalManager(); -// SymbolTable symbolTable = program.getSymbolTable(); -// -// try { -// -// Symbol librarySymbol = -// symbolTable.getSymbol(Library.UNKNOWN, program.getGlobalNamespace()); -// if (librarySymbol != null) { -// if (librarySymbol.getSymbolType() != SymbolType.LIBRARY) { -// return function; // Reserved library name misused - can't create external function -// } -// } -// else { -// Library unknownLibrary = -// extMgr.addExternalLibraryName(Library.UNKNOWN, SourceType.IMPORTED); -// librarySymbol = unknownLibrary.getSymbol(); -// } -// -// // add namespaces to unknown library -// Stack nsStack = new Stack(); -// Namespace ns = function; -// while ((ns = ns.getParentNamespace()).getID() != Namespace.GLOBAL_NAMESPACE_ID) { -// nsStack.push(ns); -// } -// Namespace parent = (Namespace) librarySymbol.getObject(); -// while (!nsStack.isEmpty()) { -// ns = nsStack.pop(); -// SymbolType type = ns.getSymbol().getSymbolType(); -// Symbol s = symbolTable.getSymbol(ns.getName(), parent); -// if (s != null) { -// if (s.getSymbolType() != type) { -// // wrong type of namespace - just return original function -// return function; -// } -// } -// else if (type == SymbolType.CLASS) { -// parent = symbolTable.createClass(parent, ns.getName(), SourceType.IMPORTED); -// } -// else { -// parent = symbolTable.createNameSpace(parent, ns.getName(), SourceType.IMPORTED); -// } -// } -// -// ExternalLocation extLoc = -// extMgr.addExtFunction(parent, function.getName(), null, SourceType.IMPORTED); -// Function extFunction = extLoc.getFunction(); -// extFunction.setCallingConvention(function.getCallingConventionName()); -// function.setThunkedFunction(extFunction); -// -// // External function will only have this parameter or none -// -// return extFunction; -// } -// catch (DuplicateNameException e) { -// // unexpected -// } -// catch (InvalidInputException e) { -// // unexpected -// } -// -// return function; // return original function on failure -// } - } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledVariable.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledVariable.java index c9a5092f52..c8c72c3b0a 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledVariable.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledVariable.java @@ -74,7 +74,7 @@ public class DemangledVariable extends DemangledObject { String n = getDemangledName(); boolean hasName = !StringUtils.isBlank(n); - StringBuffer datatypeBuffer = new StringBuffer(); + StringBuilder datatypeBuffer = new StringBuilder(); String spacer = EMPTY_STRING; if (!(datatype instanceof DemangledFunctionPointer) && !(datatype instanceof DemangledFunctionReference) && @@ -162,20 +162,6 @@ public class DemangledVariable extends DemangledObject { return buffer.toString(); } - @Override - public String getNamespaceName() { - - String n = getDemangledName(); - if (!StringUtils.isBlank(n)) { - return n; - } - - if (datatype != null) { - return datatype.getSignature(); - } - return ""; // shouldn't happen - } - @Override protected boolean isAlreadyDemangled(Program program, Address address) { Data data = program.getListing().getDefinedDataAt(address); diff --git a/Ghidra/Features/GnuDemangler/src/test/java/ghidra/app/util/demangler/GnuDemanglerParserTest.java b/Ghidra/Features/GnuDemangler/src/test/java/ghidra/app/util/demangler/GnuDemanglerParserTest.java index 1e4efa0cc5..6099c8ee21 100644 --- a/Ghidra/Features/GnuDemangler/src/test/java/ghidra/app/util/demangler/GnuDemanglerParserTest.java +++ b/Ghidra/Features/GnuDemangler/src/test/java/ghidra/app/util/demangler/GnuDemanglerParserTest.java @@ -434,6 +434,26 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { object.getSignature(false)); } + @Test + public void testTypeInfo_AddressTable() throws Exception { + + String mangled = "_ZTIN10NonDiamond1AE"; + String demangled = process.demangle(mangled); + assertEquals("typeinfo for NonDiamond::A", demangled); + + DemangledObject object = parser.parse(mangled, demangled); + assertType(object, DemangledAddressTable.class); + assertName(object, "typeinfo", "NonDiamond", "A"); + + assertEquals("NonDiamond::A::typeinfo", object.getSignature(false)); + + DemangledAddressTable addressTable = (DemangledAddressTable) object; + assertEquals("typeinfo", addressTable.getName()); + assertEquals("NonDiamond::A::typeinfo", addressTable.getNamespaceString()); + assertEquals("A", addressTable.getNamespace().getNamespaceName()); + assertEquals("NonDiamond::A", addressTable.getNamespace().getNamespaceString()); + } + @Test public void testTypeInfo() throws Exception { String mangled = "_ZTIN4Arts28FileInputStream_impl_FactoryE"; @@ -508,6 +528,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { DemangledVariable variable = (DemangledVariable) object; assertEquals("dot", variable.getName()); + assertEquals("KDirLister::emitChanges()::dot", variable.getNamespaceString()); assertEquals("emitChanges()", variable.getNamespace().getNamespaceName()); assertEquals("KDirLister::emitChanges()", variable.getNamespace().getNamespaceString()); assertNull(variable.getDataType()); // no type information provided