|
1 | 1 | package soot.jimple.toolkits.callgraph;
|
2 | 2 |
|
3 |
| -import java.lang.reflect.Constructor; |
4 |
| - |
5 | 3 | /*-
|
6 | 4 | * #%L
|
7 | 5 | * Soot - a J*va Optimization Framework
|
|
96 | 94 | import soot.jimple.StringConstant;
|
97 | 95 | import soot.jimple.VirtualInvokeExpr;
|
98 | 96 | import soot.jimple.spark.pag.AllocDotField;
|
99 |
| -import soot.jimple.spark.pag.PAG; |
100 | 97 | import soot.jimple.toolkits.annotation.nullcheck.NullnessAnalysis;
|
101 | 98 | import soot.jimple.toolkits.callgraph.ConstantArrayAnalysis.ArrayTypes;
|
102 | 99 | import soot.jimple.toolkits.callgraph.VirtualEdgesSummaries.DeferredVirtualEdgeTarget;
|
@@ -810,17 +807,21 @@ protected void findReceivers(SootMethod m, Body b) {
|
810 | 807 | if (ie instanceof InstanceInvokeExpr) {
|
811 | 808 | InstanceInvokeExpr iie = (InstanceInvokeExpr) ie;
|
812 | 809 | 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 | + } |
822 | 821 | }
|
823 | 822 | }
|
| 823 | + } else { |
| 824 | + addEdge(m, s, ie.getMethod(), Kind.SPECIAL); |
824 | 825 | }
|
825 | 826 |
|
826 | 827 | // if (!hasVirtualEdge || !iie.getMethod().isPhantom())
|
@@ -970,7 +971,7 @@ private void getImplicitTargets(SootMethod source) {
|
970 | 971 | if (!source.isConcrete()) {
|
971 | 972 | return;
|
972 | 973 | }
|
973 |
| - if (source.getSubSignature().contains("<init>")) { |
| 974 | + if (source.isConstructor()) { |
974 | 975 | handleInit(source, scl);
|
975 | 976 | }
|
976 | 977 | for (Unit u : source.retrieveActiveBody().getUnits()) {
|
|
0 commit comments