mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2024-10-23 13:41:04 +00:00
GT-3646 - Demangler - Fixed DemangledVariable to not have duplicate
namespace entries returned from getNamespaceString()
This commit is contained in:
parent
4d48d6f180
commit
bb77d3cda9
|
@ -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 + " ");
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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<Namespace> nsStack = new Stack<Namespace>();
|
||||
// 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
|
||||
// }
|
||||
|
||||
}
|
||||
|
|
|
@ -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 "<no name>"; // shouldn't happen
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean isAlreadyDemangled(Program program, Address address) {
|
||||
Data data = program.getListing().getDefinedDataAt(address);
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue
Block a user