From d8bf2f9875631e268bed5c719006c10570ed60f5 Mon Sep 17 00:00:00 2001 From: Wiz <95232096+GameCubeGBA@users.noreply.github.com> Date: Tue, 21 Dec 2021 00:45:08 -0500 Subject: [PATCH] Fix FunctionStartAnalyzer's control flow The continue keyword has no effect, when it should be breaking out of both loops to the outer one. --- .../app/analyzers/FunctionStartAnalyzer.java | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/Ghidra/Features/BytePatterns/src/main/java/ghidra/app/analyzers/FunctionStartAnalyzer.java b/Ghidra/Features/BytePatterns/src/main/java/ghidra/app/analyzers/FunctionStartAnalyzer.java index adec352a07..5c15328922 100644 --- a/Ghidra/Features/BytePatterns/src/main/java/ghidra/app/analyzers/FunctionStartAnalyzer.java +++ b/Ghidra/Features/BytePatterns/src/main/java/ghidra/app/analyzers/FunctionStartAnalyzer.java @@ -718,14 +718,8 @@ public class FunctionStartAnalyzer extends AbstractAnalyzer implements PatternFa while (addresses.hasNext() && !addedMonitor.isCancelled()) { Address address = addresses.next(); // if there are any conditional references, then this can't be a function start - ReferenceIterator referencesTo = - addedProgram.getReferenceManager().getReferencesTo(address); - while (referencesTo.hasNext()) { - Reference reference = referencesTo.next(); - if (reference.getReferenceType().isConditional()) { - continue; - } - + if (hasConditionalReferences(addedProgram, address)) { + continue; } Function funcAt = addedProgram.getFunctionManager().getFunctionContaining(address); @@ -743,6 +737,18 @@ public class FunctionStartAnalyzer extends AbstractAnalyzer implements PatternFa } return true; } + + private boolean hasConditionalReferences(Program addedProgram, Address address) { + ReferenceIterator refsTo = + addedProgram.getReferenceManager().getReferencesTo(address); + while (refsTo.hasNext()) { + Reference reference = refsTo.next(); + if (reference.getReferenceType().isConditional()) { + return true; + } + } + return false; + } }, potentialFuncResult); }