From a8ac0328f90b3d8c90d029d9bbc8e0d7125309bb Mon Sep 17 00:00:00 2001 From: ghizard <50744617+ghizard@users.noreply.github.com> Date: Tue, 9 Aug 2022 10:30:08 -0400 Subject: [PATCH] GP-2429 - Improve Demangler Analyzer post-analysis pop-up messages --- .../analysis/AbstractDemanglerAnalyzer.java | 21 +++++++++------ .../app/util/demangler/DemangledObject.java | 26 ++++++++++++++++--- .../app/util/demangler/DemangledString.java | 6 +++-- .../app/util/demangler/DemangledVariable.java | 14 +++++++--- 4 files changed, 50 insertions(+), 17 deletions(-) diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/AbstractDemanglerAnalyzer.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/AbstractDemanglerAnalyzer.java index 23ddaf8c26..a5a6bfc190 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/AbstractDemanglerAnalyzer.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/AbstractDemanglerAnalyzer.java @@ -263,29 +263,34 @@ public abstract class AbstractDemanglerAnalyzer extends AbstractAnalyzer { if (demangled.applyTo(program, address, options, monitor)) { return; } - logApplyErrorMessage(log, demangled, address, null); + String errorString = demangled.getErrorMessage(); + logApplyErrorMessage(log, demangled, address, null, errorString); } catch (Exception e) { - logApplyErrorMessage(log, demangled, address, e); + logApplyErrorMessage(log, demangled, address, e, null); } } private void logApplyErrorMessage(MessageLog log, DemangledObject demangled, Address address, - Exception exception) { + Exception exception, String errorString) { String message; String name; - if (exception == null) { + if (exception != null) { + message = ExceptionUtils.getMessage(exception); + name = StringUtils.EMPTY; + } + else if (errorString != null) { + message = errorString; + name = StringUtils.EMPTY; + } + else { // Eventually, if we switch all errors over to being passed by an exception, then // we can eliminate this block of code (and not pass null into this method). message = "Unknown error at address " + address; name = "\n\t" + demangled.getName(); } - else { - message = ExceptionUtils.getMessage(exception); - name = StringUtils.EMPTY; - } String className = demangled.getClass().getSimpleName(); log.appendMsg(getName(), "Apply failure (" + className + ": " + message + ")\n\t" + 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 2123b3cc64..b7ad71907a 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 @@ -72,6 +72,7 @@ public abstract class DemangledObject implements Demangled { // Status of mangled String converted successfully to demangled String private boolean demangledNameSucceeded = false; + private String errorMessage = null; DemangledObject(String mangled, String originalDemangled) { this.mangled = mangled; @@ -307,6 +308,25 @@ public abstract class DemangledObject implements Demangled { return false; } + /** + * Returns the error message that can be set when an error is encountered, but which is made + * available to the calling method to get details of the error beyond boolean value that is + * returned by {@link #applyTo(Program, Address, DemanglerOptions,TaskMonitor)}. + * @return a message pertaining to issues encountered in the apply methods. Can be null + */ + public String getErrorMessage() { + return errorMessage; + } + + /** + * Set the message that {@link #applyTo(Program, Address, DemanglerOptions,TaskMonitor)} caller + * can read + * @param message the message + */ + protected void setErrorMessage(String message) { + this.errorMessage = message; + } + public boolean applyTo(Program program, Address address, DemanglerOptions options, TaskMonitor monitor) throws Exception { return applyPlateCommentOnly(program, address); @@ -341,9 +361,9 @@ public abstract class DemangledObject implements Demangled { } /** - * Sets the plate comment to be used if the {@link #getOriginalDemangled()} string is not + * Sets the plate comment to be used if the {@link #getOriginalDemangled()} string is not * available - * + * * @param plateComment the plate comment text */ public void setBackupPlateComment(String plateComment) { @@ -355,7 +375,7 @@ public abstract class DemangledObject implements Demangled { * to the original demangled text. If that is not available, then any text set by * {@link #setBackupPlateComment(String)} will be used. The last choice for this text is * the signature generated by {@link #getSignature(boolean)}. - * + * * @return the text */ protected String generatePlateComment() { 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 e19dfe975d..83d1f2bd06 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 @@ -84,8 +84,10 @@ public class DemangledString extends DemangledObject { Symbol s = program.getSymbolTable().getPrimarySymbol(address); if (s != null && s.getSymbolType() == SymbolType.FUNCTION) { - Msg.error(this, - "Failed to demangled string at " + address + " due to existing function"); + String message = + "Failed to demangled string at " + address + " due to existing function"; + setErrorMessage(message); + Msg.error(this, message); return false; } 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 c8c72c3b0a..c589faae8b 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 @@ -210,7 +210,9 @@ public class DemangledVariable extends DemangledObject { CreateDataCmd cmd = new CreateDataCmd(address, demangledDT, false, ClearDataMode.CLEAR_ALL_UNDEFINED_CONFLICT_DATA); if (!cmd.applyTo(program)) { - Msg.error(this, "Failed to create data at " + address + ": " + cmd.getStatusMsg()); + String message = cmd.getStatusMsg(); + setErrorMessage(message); + Msg.error(this, message); return false; } return true; @@ -247,7 +249,9 @@ public class DemangledVariable extends DemangledObject { listing.createData(address, demangledDT); } catch (CodeUnitInsertionException e) { - Msg.trace(this, "Unable to create demangled data '" + demangledDT + "' @ " + address); + String message = "Unable to create demangled data '" + demangledDT + "' @ " + address; + setErrorMessage(message); + Msg.trace(this, message); } return true; // return true, as we did not fail to demangle @@ -306,7 +310,9 @@ public class DemangledVariable extends DemangledObject { CreateDataCmd cmd = new CreateDataCmd(address, pointer, false, ClearDataMode.CLEAR_ALL_UNDEFINED_CONFLICT_DATA); if (!cmd.applyTo(program)) { - Msg.error(this, "Failed to create pointer at " + address + ": " + cmd.getStatusMsg()); + String message = "Failed to create pointer at " + address + ": " + cmd.getStatusMsg(); + setErrorMessage(message); + Msg.error(this, message); return false; } return true; @@ -314,7 +320,7 @@ public class DemangledVariable extends DemangledObject { /** * get the next symbol defined or auto after address - * + * * @param program - program to check * @param address - address to get symbol after * @return address of the location of the next symbol or the last address in program