diff --git a/Ghidra/Framework/Graph/src/main/java/ghidra/graph/algo/ChkDominanceAlgorithm.java b/Ghidra/Framework/Graph/src/main/java/ghidra/graph/algo/ChkDominanceAlgorithm.java index 4b469d1026..7f09568af7 100644 --- a/Ghidra/Framework/Graph/src/main/java/ghidra/graph/algo/ChkDominanceAlgorithm.java +++ b/Ghidra/Framework/Graph/src/main/java/ghidra/graph/algo/ChkDominanceAlgorithm.java @@ -122,7 +122,7 @@ public class ChkDominanceAlgorithm> extends AbstractDomina while (iterator.hasNext()) { V p = iterator.next(); - if (p == newIdom) { + if (newIdom.equals(p)) { continue; } if (dominatorMap.containsKey(p)) { @@ -131,7 +131,7 @@ public class ChkDominanceAlgorithm> extends AbstractDomina } V idom = dominatorMap.get(b); - if (idom != newIdom) { + if (!newIdom.equals(idom)) { V last = dominatorMap.put(b, newIdom); dominatedMap.get(newIdom).add(b); if (last != null) { @@ -148,7 +148,7 @@ public class ChkDominanceAlgorithm> extends AbstractDomina V finger2 = v2; int finger1Index = map.get(finger1); int finger2Index = map.get(finger2); - while (finger1 != finger2) { + while (!finger1.equals(finger2)) { while (finger1Index < finger2Index) { finger1 = dominatorMap.get(finger1); finger1Index = map.get(finger1); @@ -197,7 +197,7 @@ public class ChkDominanceAlgorithm> extends AbstractDomina Set dominators = new HashSet<>(); dominators.add(a); - while (a != root) { + while (!root.equals(a)) { a = dominatorMap.get(a); // immediate dominator add(a, dominators); } diff --git a/Ghidra/Framework/Graph/src/test/java/ghidra/graph/AbstractGraphAlgorithmsTest.java b/Ghidra/Framework/Graph/src/test/java/ghidra/graph/AbstractGraphAlgorithmsTest.java index 30906d9757..c24917d455 100644 --- a/Ghidra/Framework/Graph/src/test/java/ghidra/graph/AbstractGraphAlgorithmsTest.java +++ b/Ghidra/Framework/Graph/src/test/java/ghidra/graph/AbstractGraphAlgorithmsTest.java @@ -273,34 +273,32 @@ public abstract class AbstractGraphAlgorithmsTest extends AbstractGenericTest { return id; } -// TODO put this in -// -// @Override -// public int hashCode() { -// final int prime = 31; -// int result = 1; -// result = prime * result + ((id == null) ? 0 : id.hashCode()); -// return result; -// } -// -// @Override -// public boolean equals(Object obj) { -// if (this == obj) { -// return true; -// } -// if (obj == null) { -// return false; -// } -// if (getClass() != obj.getClass()) { -// return false; -// } -// -// TestV other = (TestV) obj; -// if (!Objects.equals(id, other.id)) { -// return false; -// } -// return true; -// } + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((id == null) ? 0 : id.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + + TestV other = (TestV) obj; + if (!Objects.equals(id, other.id)) { + return false; + } + return true; + } } protected static class TestE extends DefaultGEdge { diff --git a/Ghidra/Framework/Graph/src/test/java/ghidra/graph/GraphAlgorithmsTest.java b/Ghidra/Framework/Graph/src/test/java/ghidra/graph/GraphAlgorithmsTest.java index f553fb6708..f78d6c5c80 100644 --- a/Ghidra/Framework/Graph/src/test/java/ghidra/graph/GraphAlgorithmsTest.java +++ b/Ghidra/Framework/Graph/src/test/java/ghidra/graph/GraphAlgorithmsTest.java @@ -46,7 +46,7 @@ public class GraphAlgorithmsTest extends AbstractGraphAlgorithmsTest { public void testGetSources() { TestV v1 = vertex(1); TestV v2 = vertex(2); - TestV v3 = vertex(2); + TestV v3 = vertex(3); g.addVertex(v1); g.addVertex(v2); @@ -1004,6 +1004,16 @@ public class GraphAlgorithmsTest extends AbstractGraphAlgorithmsTest { //@formatter:on } + @Test + public void testDominanceEquality() throws CancelledException { + // Regression test for https://github.com/NationalSecurityAgency/ghidra/issues/2836 + // Make sure that Object.equals() is used, not ==. + edge(vertex(1), vertex(2)); + edge(vertex(1), vertex(3)); + + GraphAlgorithms.findDominanceTree(g, TaskMonitor.DUMMY); + } + @Test public void testDepthFirstPostOrder() { // V1 -> V3 -> V6