From 5ee04b24d01e9245ef21ee3c44c2ff1dd0d1850c Mon Sep 17 00:00:00 2001 From: James <49045138+ghidracadabra@users.noreply.github.com> Date: Fri, 23 Feb 2024 18:04:40 +0000 Subject: [PATCH] GP-4354 fix comparing callees and thunks --- .../CompareFuncsFromMatchedTokensAction.java | 40 ++++++++++++++----- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/Ghidra/Features/CodeCompare/src/main/java/ghidra/codecompare/CompareFuncsFromMatchedTokensAction.java b/Ghidra/Features/CodeCompare/src/main/java/ghidra/codecompare/CompareFuncsFromMatchedTokensAction.java index 288c012f16..9fe42406f0 100644 --- a/Ghidra/Features/CodeCompare/src/main/java/ghidra/codecompare/CompareFuncsFromMatchedTokensAction.java +++ b/Ghidra/Features/CodeCompare/src/main/java/ghidra/codecompare/CompareFuncsFromMatchedTokensAction.java @@ -95,31 +95,51 @@ public class CompareFuncsFromMatchedTokensAction extends AbstractMatchedTokensAc currentPair.rightToken() == null) { return; } - FunctionComparisonService service = tool.getService(FunctionComparisonService.class); - if (service == null) { - Msg.error(this, "Function Comparison Service not found!"); - return; - } - FunctionComparisonProvider comparisonProvider = service.createFunctionComparisonProvider(); - comparisonProvider.removeAddFunctionsAction(); ClangFuncNameToken leftFuncToken = (ClangFuncNameToken) currentPair.leftToken(); ClangFuncNameToken rightFuncToken = (ClangFuncNameToken) currentPair.rightToken(); Function leftFunction = getFuncFromToken(leftFuncToken, decompPanel.getLeftProgram()); Function rightFunction = getFuncFromToken(rightFuncToken, decompPanel.getRightProgram()); - if (leftFunction == null || rightFunction == null) { return; } - comparisonProvider.getModel().compareFunctions(leftFunction, rightFunction); + FunctionComparisonService service = tool.getService(FunctionComparisonService.class); + if (service == null) { + Msg.error(this, "Function Comparison Service not found!"); + return; + } + FunctionComparisonProvider comparisonProvider = service.createFunctionComparisonProvider(); + comparisonProvider.removeAddFunctionsAction(); + comparisonProvider.getModel().compareFunctions(leftFunction, rightFunction); } private Function getFuncFromToken(ClangFuncNameToken funcToken, Program program) { Address callTarget = funcToken.getPcodeOp().getInput(0).getAddress(); - return program.getFunctionManager().getFunctionAt(callTarget); + Function func = program.getFunctionManager().getFunctionAt(callTarget); + if (func == null) { + Msg.showWarn(this, null, "Unable to Compare Callees", + "Can't compare callees - null Function for " + funcToken.getText()); + return null; + } + if (func.isExternal()) { + Msg.showWarn(this, null, "Unable to Compare Callees", + "Can't compare callees - " + func.getName() + " is external"); + return null; + } + if (!func.isThunk()) { + return func; + } + func = func.getThunkedFunction(true); + if (func.isExternal()) { + Msg.showWarn(this, null, "Unable to Compare", + "Can't compare callees - " + func.getName() + " is external"); + return null; + } + return func; + } }