diff --git a/Ghidra/Features/Base/src/main/java/ghidra/program/database/ProgramBuilder.java b/Ghidra/Features/Base/src/main/java/ghidra/program/database/ProgramBuilder.java index 697de44808..79f040cb94 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/program/database/ProgramBuilder.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/program/database/ProgramBuilder.java @@ -597,6 +597,15 @@ public class ProgramBuilder { returnType, params); } + public void deleteFunction(String address) throws Exception { + + tx(() -> { + Address entryPoint = addr(address); + FunctionManager functionManager = program.getFunctionManager(); + functionManager.removeFunction(entryPoint); + }); + } + public Library createLibrary(String libraryName) throws DuplicateNameException, InvalidInputException { return createLibrary(libraryName, SourceType.USER_DEFINED); diff --git a/Ghidra/Features/Base/src/test.slow/java/ghidra/app/plugin/core/stackeditor/AbstractStackEditorTest.java b/Ghidra/Features/Base/src/test.slow/java/ghidra/app/plugin/core/stackeditor/AbstractStackEditorTest.java index 9c9b2b2963..6adf7951e9 100644 --- a/Ghidra/Features/Base/src/test.slow/java/ghidra/app/plugin/core/stackeditor/AbstractStackEditorTest.java +++ b/Ghidra/Features/Base/src/test.slow/java/ghidra/app/plugin/core/stackeditor/AbstractStackEditorTest.java @@ -341,6 +341,12 @@ public abstract class AbstractStackEditorTest extends AbstractEditorTest { waitForBusyTool(tool); } + void deleteFunction(String address) throws Exception { + setLocation(address); + builder.deleteFunction(address); + waitForBusyTool(tool); + } + void analyzeStack(String address) { setLocation(address); DockingActionIf analyzeStack = diff --git a/Ghidra/Features/Base/src/test.slow/java/ghidra/app/plugin/core/stackeditor/StackEditorProvider1Test.java b/Ghidra/Features/Base/src/test.slow/java/ghidra/app/plugin/core/stackeditor/StackEditorProvider1Test.java index c1c3537d4e..6637f3d765 100644 --- a/Ghidra/Features/Base/src/test.slow/java/ghidra/app/plugin/core/stackeditor/StackEditorProvider1Test.java +++ b/Ghidra/Features/Base/src/test.slow/java/ghidra/app/plugin/core/stackeditor/StackEditorProvider1Test.java @@ -25,6 +25,7 @@ import javax.swing.SwingUtilities; import org.junit.Test; import docking.action.DockingActionIf; +import ghidra.app.util.datatype.EmptyCompositeException; import ghidra.framework.options.Options; import ghidra.program.model.data.*; import ghidra.program.model.listing.*; @@ -139,10 +140,12 @@ public class StackEditorProvider1Test extends AbstractStackEditorProviderTest { } @Test - public void testUndoAssociatedFunctionCreate() throws Exception { + public void testDeleteAssociatedFunction() throws Exception { Window dialog; // Create the stack frame @ 00000200. createFunction("0x200"); + waitForBusyTool(tool); // wait for analysis to complete + editStack("0x200"); Function f = program.getFunctionManager().getFunctionAt(addr("0x200")); @@ -159,16 +162,23 @@ public class StackEditorProvider1Test extends AbstractStackEditorProviderTest { // Put byte at -0x18 setType(new ByteDataType(), 0); - // Undo the apply of a new data type to an editor component. - undo(program, false); // don't wait, in case there is a modal dialog - waitForSwing(); + runSwing(() -> { + try { + model.apply(); + } + catch (EmptyCompositeException | InvalidDataTypeException e) { + failWithException("Editor apply failure", e); + } + }); + + deleteFunction("0x200"); // Verify the Reload Stack Editor? dialog is not displayed. dialog = getWindow("Reload Stack Editor?"); assertNull(dialog); // Verify the stack editor is not displayed. - assertStackEditorHidden(f); + assertStackEditorHidden(f); // This occurs if function is removed } @Test