mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-05 19:42:36 +02:00
GP-4634 Refactored Function Compare Service and added action to add
functions to the last comparison window.
This commit is contained in:
parent
c19facf226
commit
ddd2f22c28
45 changed files with 2086 additions and 3015 deletions
|
@ -25,7 +25,7 @@ import javax.swing.table.TableColumnModel;
|
|||
import org.junit.Test;
|
||||
|
||||
import docking.action.DockingActionIf;
|
||||
import docking.widgets.dialogs.TableChooserDialog;
|
||||
import docking.widgets.dialogs.TableSelectionDialog;
|
||||
import docking.widgets.table.GFilterTable;
|
||||
import docking.widgets.table.GTable;
|
||||
import ghidra.app.cmd.disassemble.DisassembleCommand;
|
||||
|
@ -94,12 +94,11 @@ public class FunctionComparisonScreenShots extends GhidraScreenShotGenerator {
|
|||
f2.setName("FunctionB", SourceType.USER_DEFINED);
|
||||
destListing.setComment(addr(0x004118c0), CodeUnit.PLATE_COMMENT, null);
|
||||
|
||||
FunctionComparisonProviderManager providerMgr =
|
||||
getInstanceFieldByClassType(FunctionComparisonProviderManager.class, plugin);
|
||||
FunctionComparisonProvider functionComparisonProvider =
|
||||
providerMgr.compareFunctions(f1, f2);
|
||||
plugin.createComparison(f1, f2);
|
||||
FunctionComparisonProvider provider =
|
||||
waitForComponentProvider(FunctionComparisonProvider.class);
|
||||
FunctionComparisonPanel functionComparisonPanel =
|
||||
functionComparisonProvider.getComponent();
|
||||
provider.getComponent();
|
||||
runSwing(() -> {
|
||||
functionComparisonPanel.setCurrentTabbedComponent("Listing View");
|
||||
ListingCodeComparisonPanel dualListing =
|
||||
|
@ -125,9 +124,7 @@ public class FunctionComparisonScreenShots extends GhidraScreenShotGenerator {
|
|||
Function f1 = getFunction(sourceProgram, addr(0x004118f0));
|
||||
Function f2 = getFunction(destinationProgram, addr(0x004118c0));
|
||||
|
||||
FunctionComparisonProviderManager providerMgr =
|
||||
getInstanceFieldByClassType(FunctionComparisonProviderManager.class, plugin);
|
||||
providerMgr.compareFunctions(f1, f2);
|
||||
plugin.createComparison(f1, f2);
|
||||
|
||||
captureActionIcon("Add Functions To Comparison");
|
||||
}
|
||||
|
@ -137,9 +134,7 @@ public class FunctionComparisonScreenShots extends GhidraScreenShotGenerator {
|
|||
Function f1 = getFunction(sourceProgram, addr(0x004118f0));
|
||||
Function f2 = getFunction(destinationProgram, addr(0x004118c0));
|
||||
|
||||
FunctionComparisonProviderManager providerMgr =
|
||||
getInstanceFieldByClassType(FunctionComparisonProviderManager.class, plugin);
|
||||
providerMgr.compareFunctions(f1, f2);
|
||||
plugin.createComparison(f1, f2);
|
||||
|
||||
captureActionIcon("Remove Functions");
|
||||
}
|
||||
|
@ -149,9 +144,7 @@ public class FunctionComparisonScreenShots extends GhidraScreenShotGenerator {
|
|||
Function f1 = getFunction(sourceProgram, addr(0x004118f0));
|
||||
Function f2 = getFunction(destinationProgram, addr(0x004118c0));
|
||||
|
||||
FunctionComparisonProviderManager providerMgr =
|
||||
getInstanceFieldByClassType(FunctionComparisonProviderManager.class, plugin);
|
||||
providerMgr.compareFunctions(CollectionUtils.asSet(f1, f2));
|
||||
plugin.createComparison(CollectionUtils.asSet(f1, f2));
|
||||
|
||||
captureActionIcon("Compare Next Function");
|
||||
}
|
||||
|
@ -161,13 +154,7 @@ public class FunctionComparisonScreenShots extends GhidraScreenShotGenerator {
|
|||
Function f1 = getFunction(sourceProgram, addr(0x004118f0));
|
||||
Function f2 = getFunction(destinationProgram, addr(0x004118c0));
|
||||
|
||||
FunctionComparisonProviderManager providerMgr =
|
||||
getInstanceFieldByClassType(FunctionComparisonProviderManager.class, plugin);
|
||||
FunctionComparisonProvider functionComparisonProvider =
|
||||
providerMgr.compareFunctions(CollectionUtils.asSet(f1, f2));
|
||||
MultiFunctionComparisonPanel panel =
|
||||
(MultiFunctionComparisonPanel) functionComparisonProvider.getComponent();
|
||||
panel.getFocusedComponent().setSelectedIndex(1);
|
||||
plugin.createComparison(CollectionUtils.asSet(f1, f2));
|
||||
|
||||
captureActionIcon("Compare Previous Function");
|
||||
}
|
||||
|
@ -177,21 +164,18 @@ public class FunctionComparisonScreenShots extends GhidraScreenShotGenerator {
|
|||
Function f1 = getFunction(sourceProgram, addr(0x004118f0));
|
||||
Function f2 = getFunction(destinationProgram, addr(0x004118c0));
|
||||
|
||||
FunctionComparisonProviderManager providerMgr =
|
||||
getInstanceFieldByClassType(FunctionComparisonProviderManager.class, plugin);
|
||||
providerMgr.compareFunctions(CollectionUtils.asSet(f1, f2));
|
||||
plugin.createComparison(CollectionUtils.asSet(f1, f2));
|
||||
waitForSwing();
|
||||
|
||||
DockingActionIf openTableAction = getAction(plugin, "Add Functions To Comparison");
|
||||
DockingActionIf openTableAction = getAction(tool, "Add Functions To Comparison");
|
||||
performAction(openTableAction, false);
|
||||
|
||||
TableChooserDialog<?> dialog =
|
||||
waitForDialogComponent(TableChooserDialog.class);
|
||||
TableSelectionDialog<?> dialog = waitForDialogComponent(TableSelectionDialog.class);
|
||||
setColumnSizes(dialog);
|
||||
captureDialog(dialog);
|
||||
}
|
||||
|
||||
private void setColumnSizes(TableChooserDialog<?> dialog) {
|
||||
private void setColumnSizes(TableSelectionDialog<?> dialog) {
|
||||
// note: these values are rough values found by trial-and-error
|
||||
|
||||
GFilterTable<?> filter = (GFilterTable<?>) getInstanceField("gFilterTable", dialog);
|
||||
|
|
|
@ -15,18 +15,23 @@
|
|||
*/
|
||||
package ghidra.app.plugin.compare;
|
||||
|
||||
import static ghidra.util.datastruct.Duo.Side.*;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import org.junit.*;
|
||||
|
||||
import ghidra.app.plugin.core.functioncompare.*;
|
||||
import ghidra.app.plugin.core.functioncompare.FunctionComparisonPlugin;
|
||||
import ghidra.app.plugin.core.functioncompare.FunctionComparisonProvider;
|
||||
import ghidra.app.services.FunctionComparisonModel;
|
||||
import ghidra.codecompare.decompile.CDisplay;
|
||||
import ghidra.codecompare.decompile.DecompilerCodeComparisonPanel;
|
||||
import ghidra.program.model.address.Address;
|
||||
import ghidra.program.model.listing.*;
|
||||
import ghidra.test.*;
|
||||
import ghidra.util.datastruct.Duo.Side;
|
||||
|
||||
/**
|
||||
* Tests for the {@link FunctionComparisonPlugin function comparison plugin}
|
||||
|
@ -39,7 +44,6 @@ public class CompareFunctionsDecompilerViewTest extends AbstractGhidraHeadedInte
|
|||
private Function fun1;
|
||||
private Function fun2;
|
||||
private FunctionComparisonPlugin plugin;
|
||||
private FunctionComparisonProvider provider;
|
||||
|
||||
@Before
|
||||
public void setUp() throws Exception {
|
||||
|
@ -65,10 +69,13 @@ public class CompareFunctionsDecompilerViewTest extends AbstractGhidraHeadedInte
|
|||
|
||||
@Test
|
||||
public void testDecompDifView() throws Exception {
|
||||
Set<Function> functions = CompareFunctionsTestUtility.getFunctionsAsSet(fun1, fun2);
|
||||
provider = compareFunctions(functions);
|
||||
Set<Function> functions = Set.of(fun1, fun2);
|
||||
compareFunctions(functions);
|
||||
|
||||
CompareFunctionsTestUtility.checkSourceFunctions(provider, fun1, fun2);
|
||||
FunctionComparisonProvider provider =
|
||||
waitForComponentProvider(FunctionComparisonProvider.class);
|
||||
|
||||
checkFunctions(provider, LEFT, fun1, fun1, fun2);
|
||||
DecompilerCodeComparisonPanel panel =
|
||||
(DecompilerCodeComparisonPanel) provider
|
||||
.getCodeComparisonPanelByName(DecompilerCodeComparisonPanel.NAME);
|
||||
|
@ -78,6 +85,18 @@ public class CompareFunctionsDecompilerViewTest extends AbstractGhidraHeadedInte
|
|||
assertHasLines(panel.getRightPanel(), 23);
|
||||
}
|
||||
|
||||
private void checkFunctions(FunctionComparisonProvider provider, Side side,
|
||||
Function activeFunction, Function... functions) {
|
||||
Set<Function> funcs = Set.of(functions);
|
||||
|
||||
FunctionComparisonModel model = provider.getModel();
|
||||
assertEquals(activeFunction, model.getActiveFunction(side));
|
||||
|
||||
List<Function> fcs = model.getFunctions(side);
|
||||
assertEquals(fcs.size(), funcs.size());
|
||||
assertTrue(fcs.containsAll(funcs));
|
||||
}
|
||||
|
||||
private void assertHasLines(CDisplay panel, int lineCount) {
|
||||
assertEquals(lineCount, panel.getDecompilerPanel().getLines().size());
|
||||
}
|
||||
|
@ -88,11 +107,9 @@ public class CompareFunctionsDecompilerViewTest extends AbstractGhidraHeadedInte
|
|||
waitForSwing();
|
||||
}
|
||||
|
||||
private FunctionComparisonProvider compareFunctions(Set<Function> functions) {
|
||||
provider = runSwing(() -> plugin.compareFunctions(functions));
|
||||
provider.setVisible(true);
|
||||
private void compareFunctions(Set<Function> functions) {
|
||||
runSwing(() -> plugin.createComparison(functions));
|
||||
waitForSwing();
|
||||
return provider;
|
||||
}
|
||||
|
||||
private Program buildTestProgram() throws Exception {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue