Skip to content

Commit ebad725

Browse files
authored
Merge branch 'develop' into edge
2 parents 9072b06 + d451710 commit ebad725

File tree

1 file changed

+14
-13
lines changed

1 file changed

+14
-13
lines changed

src/main/java/soot/jimple/toolkits/callgraph/OnFlyCallGraphBuilder.java

+14-13
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package soot.jimple.toolkits.callgraph;
22

3-
import java.lang.reflect.Constructor;
4-
53
/*-
64
* #%L
75
* Soot - a J*va Optimization Framework
@@ -96,7 +94,6 @@
9694
import soot.jimple.StringConstant;
9795
import soot.jimple.VirtualInvokeExpr;
9896
import soot.jimple.spark.pag.AllocDotField;
99-
import soot.jimple.spark.pag.PAG;
10097
import soot.jimple.toolkits.annotation.nullcheck.NullnessAnalysis;
10198
import soot.jimple.toolkits.callgraph.ConstantArrayAnalysis.ArrayTypes;
10299
import soot.jimple.toolkits.callgraph.VirtualEdgesSummaries.DeferredVirtualEdgeTarget;
@@ -810,17 +807,21 @@ protected void findReceivers(SootMethod m, Body b) {
810807
if (ie instanceof InstanceInvokeExpr) {
811808
InstanceInvokeExpr iie = (InstanceInvokeExpr) ie;
812809
Local receiver = (Local) iie.getBase();
813-
MethodSubSignature subSig = new MethodSubSignature(iie.getMethodRef());
814-
815-
VirtualEdge virtualEdge = virtualEdgeSummaries.getVirtualEdgesMatchingSubSig(subSig);
816-
if (virtualEdge != null) {
817-
for (VirtualEdgeTarget t : virtualEdge.targets) {
818-
if (t instanceof InvocationVirtualEdgeTarget) {
819-
processVirtualEdgeSummary(m, s, receiver, (InvocationVirtualEdgeTarget) t, virtualEdge.edgeType);
820-
} else if (t instanceof DeferredVirtualEdgeTarget) {
821-
addVirtualCallSite(s, m, receiver, iie, new MethodSubSignature(iie.getMethodRef()), Kind.GENERIC_FAKE);
810+
if (!(iie instanceof SpecialInvokeExpr)) {
811+
MethodSubSignature subSig = new MethodSubSignature(iie.getMethodRef());
812+
813+
VirtualEdge virtualEdge = virtualEdgeSummaries.getVirtualEdgesMatchingSubSig(subSig);
814+
if (virtualEdge != null) {
815+
for (VirtualEdgeTarget t : virtualEdge.targets) {
816+
if (t instanceof InvocationVirtualEdgeTarget) {
817+
processVirtualEdgeSummary(m, s, receiver, (InvocationVirtualEdgeTarget) t, virtualEdge.edgeType);
818+
} else if (t instanceof DeferredVirtualEdgeTarget) {
819+
addVirtualCallSite(s, m, receiver, iie, new MethodSubSignature(iie.getMethodRef()), Kind.GENERIC_FAKE);
820+
}
822821
}
823822
}
823+
} else {
824+
addEdge(m, s, ie.getMethod(), Kind.SPECIAL);
824825
}
825826

826827
// if (!hasVirtualEdge || !iie.getMethod().isPhantom())
@@ -970,7 +971,7 @@ private void getImplicitTargets(SootMethod source) {
970971
if (!source.isConcrete()) {
971972
return;
972973
}
973-
if (source.getSubSignature().contains("<init>")) {
974+
if (source.isConstructor()) {
974975
handleInit(source, scl);
975976
}
976977
for (Unit u : source.retrieveActiveBody().getUnits()) {

0 commit comments

Comments
 (0)