diff --git a/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/FGPrimaryViewer.java b/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/FGPrimaryViewer.java index 6b6363c825..611f88165c 100644 --- a/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/FGPrimaryViewer.java +++ b/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/FGPrimaryViewer.java @@ -50,6 +50,7 @@ public class FGPrimaryViewer extends GraphViewer { return new VisualGraphPathHighlighter<>(getVisualGraph(), listener) { + @Override protected GDirectedGraph getDominanceGraph( VisualGraph graph, boolean forward) { diff --git a/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/FunctionGraph.java b/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/FunctionGraph.java index e773a673f6..f54adb0b36 100644 --- a/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/FunctionGraph.java +++ b/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/FunctionGraph.java @@ -604,7 +604,7 @@ public class FunctionGraph extends GroupingVisualGraph { for (FGVertex entry : entries) { AbstractFunctionGraphVertex abstractVertex = (AbstractFunctionGraphVertex) entry; FGController controller = abstractVertex.getController(); - ListingFunctionGraphVertex newEntry = new ListingFunctionGraphVertex(controller, + ListingFunctionGraphVertex newEntry = new DummyListingFGVertex(controller, abstractVertex.getAddresses(), RefType.UNCONDITIONAL_JUMP, true); newEntry.setVertexType(FGVertexType.ENTRY); FGVertex groupVertex = getVertexForAddress(entry.getVertexAddress()); diff --git a/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/vertex/DummyListingFGVertex.java b/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/vertex/DummyListingFGVertex.java new file mode 100644 index 0000000000..6e0a1dd023 --- /dev/null +++ b/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/vertex/DummyListingFGVertex.java @@ -0,0 +1,42 @@ +/* ### + * IP: GHIDRA + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package ghidra.app.plugin.core.functiongraph.graph.vertex; + +import ghidra.app.plugin.core.functiongraph.mvc.FGController; +import ghidra.program.model.address.AddressSetView; +import ghidra.program.model.symbol.FlowType; + +/** + * A vertex that is used as a temporary placeholder for graph algorithms that require a + * particular structure, such as having a source or sink + */ +public class DummyListingFGVertex extends ListingFunctionGraphVertex { + + public DummyListingFGVertex(FGController controller, AddressSetView addressSet, + FlowType flowType, boolean isEntry) { + super(controller, addressSet, flowType, isEntry); + } + + @Override + public String toString() { + return "Dummy " + super.toString(); + } + + @Override + public boolean equals(Object obj) { + return this == obj; + } +} diff --git a/Ghidra/Features/FunctionGraph/src/test/java/ghidra/app/plugin/core/functiongraph/FunctionGraphGroupVertices2Test.java b/Ghidra/Features/FunctionGraph/src/test/java/ghidra/app/plugin/core/functiongraph/FunctionGraphGroupVertices2Test.java index 0b577ec80a..0913a97a80 100644 --- a/Ghidra/Features/FunctionGraph/src/test/java/ghidra/app/plugin/core/functiongraph/FunctionGraphGroupVertices2Test.java +++ b/Ghidra/Features/FunctionGraph/src/test/java/ghidra/app/plugin/core/functiongraph/FunctionGraphGroupVertices2Test.java @@ -447,6 +447,36 @@ public class FunctionGraphGroupVertices2Test extends AbstractFunctionGraphTest { assertHovered(edges); } + @Test + public void testFindForwardScopedFlow_WithoutGroup_IncomingEdgeToRoot() { + + // + // Test the case that an ungrouped graph does not throw an exception if the root node + // is hovered when it has incoming edges. + // + + create12345GraphWithTransaction(); + + FGVertex entry = vertex("100415a"); + FGVertex v2 = vertex("1004178"); + + FunctionGraph graph = getFunctionGraph(); + FGEdgeImpl edge = new FGEdgeImpl(v2, entry, RefType.UNCONDITIONAL_JUMP, graph.getOptions()); + graph.addEdge(edge); + + FGComponent graphComponent = getGraphComponent(); + VisualGraphPathHighlighter pathHighlighter = + graphComponent.getPathHighlighter(); + pathHighlighter.setHoveredVertex(entry); + waitForPathHighligter(); + + Collection edges = graph.getEdges(); + assertHovered(edges); + + pathHighlighter.setHoveredVertex(null); + assertHovered(Collections.emptySet()); + } + //================================================================================================== // Private Methods //==================================================================================================