diff --git a/CHANGELOG.md b/CHANGELOG.md index 586bdd4..d043300 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Current Release +## 231201 + +- Improvements: +* Improve HighCfg entry node heuristic +* Add additional logging when failing to create decompiler +* Ensure that start and goal addresses are valid instructions + ## 231003 - Improvements: diff --git a/src/main/java/kaiju/tools/ghihorn/decompiler/DecompilerFactory.java b/src/main/java/kaiju/tools/ghihorn/decompiler/DecompilerFactory.java index d813fc5..39e0081 100644 --- a/src/main/java/kaiju/tools/ghihorn/decompiler/DecompilerFactory.java +++ b/src/main/java/kaiju/tools/ghihorn/decompiler/DecompilerFactory.java @@ -32,7 +32,7 @@ public DecompInterface createDecompiler() { options.grabFromToolAndProgram(null, opt, program); } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | SecurityException e) { - throw new RuntimeException("Unable to create decompiler"); + throw new RuntimeException("Unable to create decompiler: " + e.toString(), e); } decompiler.setOptions(options); diff --git a/src/main/java/kaiju/tools/ghihorn/tools/pathanalyzer/PathAnalyzerController.java b/src/main/java/kaiju/tools/ghihorn/tools/pathanalyzer/PathAnalyzerController.java index 09557eb..5f0419b 100644 --- a/src/main/java/kaiju/tools/ghihorn/tools/pathanalyzer/PathAnalyzerController.java +++ b/src/main/java/kaiju/tools/ghihorn/tools/pathanalyzer/PathAnalyzerController.java @@ -14,6 +14,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Consumer; import java.util.stream.Collectors; import javax.swing.BorderFactory; import javax.swing.JCheckBox; @@ -415,11 +416,16 @@ public List> getCommandParameters() throws Exception { final Address endAddr = program.getAddressFactory().getDefaultAddressSpace() .getAddress(goalAddrText.getText()); - // Make sure that the program contains the specified addresses - if (!program.getMemory().contains(startAddr) - || !program.getMemory().contains(endAddr)) { - throw new RuntimeException(); - } + // Make sure that the program contains the specified addresses as instructions + Consumer
verifyAddress = (Address addr) -> { + if (program.getListing().getInstructionAt(addr) == null) { + throw new RuntimeException("Start or goal address " + addr + " is not an instruction"); + }; + }; + + verifyAddress.accept(startAddr); + verifyAddress.accept(endAddr); + this.startAddrText.setText(startAddr.toString()); status("Looking for path from " + startAddr + " to " + endAddr);