diff --git a/build.gradle b/build.gradle index ec9fec7..6191b0a 100644 --- a/build.gradle +++ b/build.gradle @@ -15,11 +15,13 @@ version '0.9.2-SNAPSHOT' java { toolchain { - languageVersion = JavaLanguageVersion.of(16) + languageVersion = JavaLanguageVersion.of(17) } } repositories { + mavenLocal() + maven { url "https://maven.aliyun.com/repository/central" } mavenCentral() } @@ -68,8 +70,7 @@ subprojects { java { toolchain { - languageVersion = JavaLanguageVersion.of(16) - vendor = JvmVendorSpec.ADOPTIUM + languageVersion = JavaLanguageVersion.of(17) } } publishing.publications { diff --git a/qilin.core/src/qilin/core/PTA.java b/qilin.core/src/qilin/core/PTA.java index 564e3a4..6f7e3b4 100644 --- a/qilin.core/src/qilin/core/PTA.java +++ b/qilin.core/src/qilin/core/PTA.java @@ -255,4 +255,15 @@ public boolean mayAlias(Local l1, Local l2) { PointsToSet pts2 = reachingObjects(l2).toCIPointsToSet(); return pts1.hasNonEmptyIntersection(pts2); } + + @Override + public soot.PointsToSet reachingObjectsOfArrayElement(soot.PointsToSet pointsToSet) { + return this.reachingObjectsOfArrayElement((PointsToSet)pointsToSet); + } + + + @Override + public soot.PointsToSet reachingObjects(soot.PointsToSet pointsToSet, SootField sootField) { + return this.reachingObjects((PointsToSet)pointsToSet, sootField); + } } diff --git a/qilin.core/src/qilin/core/PTAScene.java b/qilin.core/src/qilin/core/PTAScene.java index 2becfa9..ec66e19 100644 --- a/qilin.core/src/qilin/core/PTAScene.java +++ b/qilin.core/src/qilin/core/PTAScene.java @@ -26,6 +26,7 @@ import soot.util.IterableNumberer; import soot.util.StringNumberer; +import java.util.List; import java.util.Set; public class PTAScene { @@ -107,6 +108,9 @@ public FastHierarchy getOrMakeFastHierarchy() { return sootScene.getOrMakeFastHierarchy(); } + public List getEntryPoints() { + return Scene.v().getEntryPoints(); + } public SootClass loadClassAndSupport(String className) { return sootScene.loadClassAndSupport(className); } diff --git a/qilin.core/src/qilin/core/PointsToAnalysis.java b/qilin.core/src/qilin/core/PointsToAnalysis.java index e9584cb..3e352ea 100644 --- a/qilin.core/src/qilin/core/PointsToAnalysis.java +++ b/qilin.core/src/qilin/core/PointsToAnalysis.java @@ -30,7 +30,7 @@ * @author Ondrej Lhotak */ -public interface PointsToAnalysis { +public interface PointsToAnalysis extends soot.PointsToAnalysis { int THIS_NODE = -1; int RETURN_NODE = -2; diff --git a/qilin.core/src/qilin/core/builder/CallGraphBuilder.java b/qilin.core/src/qilin/core/builder/CallGraphBuilder.java index b866ac1..0600676 100644 --- a/qilin.core/src/qilin/core/builder/CallGraphBuilder.java +++ b/qilin.core/src/qilin/core/builder/CallGraphBuilder.java @@ -36,6 +36,7 @@ import soot.util.queue.QueueReader; import java.util.*; +import java.util.stream.Collectors; public class CallGraphBuilder { protected final Map> receiverToSites; @@ -107,10 +108,7 @@ private void constructCallGraph() { } public List getEntryPoints() { - Node thisRef = pag.getMethodPAG(PTAScene.v().getFakeMainMethod()).nodeFactory().caseThis(); - thisRef = pta.parameterize(thisRef, pta.emptyContext()); - pag.addEdge(pta.getRootNode(), thisRef); - return Collections.singletonList(pta.parameterize(PTAScene.v().getFakeMainMethod(), pta.emptyContext())); + return PTAScene.v().getEntryPoints().stream().map(x -> pta.parameterize(x, pta.emptyContext())).collect(Collectors.toList()); } public void initReachableMethods() { @@ -153,10 +151,11 @@ private void addVirtualEdge(MethodOrMethodContext caller, Unit callStmt, SootMet public void injectCallEdge(Object heapOrType, MethodOrMethodContext callee, Kind kind) { Map stmtMap = methodToInvokeStmt.computeIfAbsent(callee.method(), k -> DataFactory.createMap()); if (!stmtMap.containsKey(heapOrType)) { + SootMethod rm = PTAScene.v().getMethod(""); InvokeExpr ie = new JStaticInvokeExpr(callee.method().makeRef(), Collections.emptyList()); JInvokeStmt stmt = new JInvokeStmt(ie); stmtMap.put(heapOrType, stmt); - handleCallEdge(new Edge(pta.parameterize(PTAScene.v().getFakeMainMethod(), pta.emptyContext()), stmtMap.get(heapOrType), callee, kind)); + handleCallEdge(new Edge(pta.parameterize(rm, pta.emptyContext()), stmtMap.get(heapOrType), callee, kind)); } } diff --git a/qilin.core/src/qilin/core/builder/FakeMainFactory.java b/qilin.core/src/qilin/core/builder/FakeMainFactory.java index 669201c..db92f47 100644 --- a/qilin.core/src/qilin/core/builder/FakeMainFactory.java +++ b/qilin.core/src/qilin/core/builder/FakeMainFactory.java @@ -142,7 +142,7 @@ private void makeFakeMain() { addInvoke(defaultClassLoader, "()>"); Value vClass = getNextLocal(RefType.v("java.lang.Class")); Value vDomain = getNextLocal(RefType.v("java.security.ProtectionDomain")); - addInvoke(defaultClassLoader, "", sv); + addInvoke(defaultClassLoader, "", sv); addInvoke(defaultClassLoader, "", vClass, vDomain); addInvoke(defaultClassLoader, "", vClass); diff --git a/qilin.core/src/qilin/core/sets/PointsToSet.java b/qilin.core/src/qilin/core/sets/PointsToSet.java index e608a16..9f49e3b 100644 --- a/qilin.core/src/qilin/core/sets/PointsToSet.java +++ b/qilin.core/src/qilin/core/sets/PointsToSet.java @@ -31,7 +31,7 @@ * * @author Ondrej Lhotak */ -public interface PointsToSet { +public interface PointsToSet extends soot.PointsToSet { /** * Returns true if this set contains no run-time objects. */ diff --git a/qilin.core/src/qilin/core/sets/UnmodifiablePointsToSet.java b/qilin.core/src/qilin/core/sets/UnmodifiablePointsToSet.java index c820fbd..c813cf3 100644 --- a/qilin.core/src/qilin/core/sets/UnmodifiablePointsToSet.java +++ b/qilin.core/src/qilin/core/sets/UnmodifiablePointsToSet.java @@ -43,6 +43,11 @@ public boolean isEmpty() { return pts.isEmpty(); } + @Override + public boolean hasNonEmptyIntersection(soot.PointsToSet pointsToSet) { + return hasNonEmptyIntersection((PointsToSet)pointsToSet); + } + @Override public boolean contains(AllocNode n) { return pts.contains(n.getNumber()); diff --git a/qilin.core/src/qilin/util/PTAUtils.java b/qilin.core/src/qilin/util/PTAUtils.java index c403ea1..945cc91 100644 --- a/qilin.core/src/qilin/util/PTAUtils.java +++ b/qilin.core/src/qilin/util/PTAUtils.java @@ -35,6 +35,7 @@ import soot.jimple.*; import soot.jimple.toolkits.callgraph.CallGraph; import soot.jimple.toolkits.callgraph.Edge; +import soot.options.Options; import soot.util.NumberedString; import soot.util.dot.DotGraph; import soot.util.dot.DotGraphConstants; @@ -248,7 +249,7 @@ public static boolean isUnresolved(Type type) { return true; } SootClass cl = rt.getSootClass(); - return cl.resolvingLevel() < SootClass.HIERARCHY; + return (!Options.v().ignore_resolving_levels()) && cl.resolvingLevel() < SootClass.HIERARCHY; } public static boolean castNeverFails(Type src, Type dst) { diff --git a/qilin.microben/build.gradle b/qilin.microben/build.gradle index b386522..ebedb90 100644 --- a/qilin.microben/build.gradle +++ b/qilin.microben/build.gradle @@ -8,13 +8,9 @@ version '1.0-SNAPSHOT' java { toolchain { languageVersion = JavaLanguageVersion.of(8) - vendor = JvmVendorSpec.ADOPTIUM } } -repositories { - mavenCentral() -} sourceSets.main { java.srcDirs = ['src'] } \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index ca5aafe..38f4e2c 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,3 +1,9 @@ +pluginManagement { + repositories { + maven { url "https://maven.aliyun.com/repository/gradle-plugin" } + gradlePluginPortal() + } +} rootProject.name = 'Qilin' include 'qilin.util' include 'qilin.core'