@Override public Collection<MemoryAccess> getFieldReads(PointerKey baseRef, IField field) { Collection<MemoryAccess> memAccesses = new ArrayList<>(); for (InstanceKey ik : pa.getPointsToSet(baseRef)) { PointerKey ifk = heapModel.getPointerKeyForInstanceField(ik, field); convertStmtsToMemoryAccess(invRef.get(ifk), memAccesses); } return memAccesses; }
@Override public Collection<MemoryAccess> getArrayReads(PointerKey arrayRef) { Collection<MemoryAccess> memAccesses = new ArrayList<>(); if (DEBUG) { System.err.println(("looking at reads of array ref " + arrayRef)); } for (InstanceKey ik : pa.getPointsToSet(arrayRef)) { PointerKey ack = heapModel.getPointerKeyForArrayContents(ik); convertStmtsToMemoryAccess(invRef.get(ack), memAccesses); } return memAccesses; }
@Override public Collection<MemoryAccess> getFieldWrites(PointerKey baseRef, IField field) { Collection<MemoryAccess> memAccesses = new ArrayList<>(); for (InstanceKey ik : pa.getPointsToSet(baseRef)) { PointerKey ifk = heapModel.getPointerKeyForInstanceField(ik, field); convertStmtsToMemoryAccess(invMod.get(ifk), memAccesses); } return memAccesses; }
@Override public Collection<MemoryAccess> getFieldReads(PointerKey baseRef, IField field) { Collection<MemoryAccess> memAccesses = new ArrayList<>(); for (InstanceKey ik : pa.getPointsToSet(baseRef)) { PointerKey ifk = heapModel.getPointerKeyForInstanceField(ik, field); convertStmtsToMemoryAccess(invRef.get(ifk), memAccesses); } return memAccesses; }
@Override public Collection<MemoryAccess> getArrayReads(PointerKey arrayRef) { Collection<MemoryAccess> memAccesses = new ArrayList<>(); if (DEBUG) { System.err.println(("looking at reads of array ref " + arrayRef)); } for (InstanceKey ik : pa.getPointsToSet(arrayRef)) { PointerKey ack = heapModel.getPointerKeyForArrayContents(ik); convertStmtsToMemoryAccess(invRef.get(ack), memAccesses); } return memAccesses; }
@Override public Collection<MemoryAccess> getFieldWrites(PointerKey baseRef, IField field) { Collection<MemoryAccess> memAccesses = new ArrayList<>(); for (InstanceKey ik : pa.getPointsToSet(baseRef)) { PointerKey ifk = heapModel.getPointerKeyForInstanceField(ik, field); convertStmtsToMemoryAccess(invMod.get(ifk), memAccesses); } return memAccesses; }
private static boolean predHoldsForPk(PointerKey curPk, Predicate<InstanceKey> pred, PointerAnalysis<InstanceKey> pa) { PointerKey curPkForPAHeapModel = convertToHeapModel(curPk, pa.getHeapModel()); OrdinalSet<InstanceKey> pointsToSet = pa.getPointsToSet(curPkForPAHeapModel); for (InstanceKey ik : pointsToSet) { if (!pred.test(ik)) { return false; } } return true; }
private static boolean mayAliased(PointerKey pk1, PointerKey pk2, PointerAnalysis<InstanceKey> pa) { OrdinalSet<InstanceKey> ptsTo1 = pa.getPointsToSet(pk1); OrdinalSet<InstanceKey> ptsTo2 = pa.getPointsToSet(pk2); boolean foundIntersection = false; outer: for (InstanceKey i : ptsTo1) { for (InstanceKey j : ptsTo2) { if (i.equals(j)) { foundIntersection = true; break outer; } } } return foundIntersection; }
private static boolean predHoldsForPk(PointerKey curPk, Predicate<InstanceKey> pred, PointerAnalysis<InstanceKey> pa) { PointerKey curPkForPAHeapModel = convertToHeapModel(curPk, pa.getHeapModel()); OrdinalSet<InstanceKey> pointsToSet = pa.getPointsToSet(curPkForPAHeapModel); for (InstanceKey ik : pointsToSet) { if (!pred.test(ik)) { return false; } } return true; }
@Override public void visitArrayStore(SSAArrayStoreInstruction instruction) { PointerKey ref = h.getPointerKeyForLocal(n, instruction.getArrayRef()); for (InstanceKey i : pa.getPointsToSet(ref)) { result.add(h.getPointerKeyForArrayContents(i)); } }
@Override public void visitArrayLength(SSAArrayLengthInstruction instruction) { PointerKey ref = h.getPointerKeyForLocal(n, instruction.getArrayRef()); for (InstanceKey i : pa.getPointsToSet(ref)) { result.add(h.getPointerKeyForArrayLength(i)); } }
@Override public void visitArrayLength(SSAArrayLengthInstruction instruction) { PointerKey ref = h.getPointerKeyForLocal(n, instruction.getArrayRef()); for (InstanceKey i : pa.getPointsToSet(ref)) { result.add(h.getPointerKeyForArrayLength(i)); } }
@Override public void visitArrayLoad(SSAArrayLoadInstruction instruction) { PointerKey ref = h.getPointerKeyForLocal(n, instruction.getArrayRef()); for (InstanceKey i : pa.getPointsToSet(ref)) { result.add(h.getPointerKeyForArrayContents(i)); } }
@Override public void visitArrayLoad(SSAArrayLoadInstruction instruction) { PointerKey ref = h.getPointerKeyForLocal(n, instruction.getArrayRef()); for (InstanceKey i : pa.getPointsToSet(ref)) { result.add(h.getPointerKeyForArrayContents(i)); } }
@Override public void visitArrayStore(SSAArrayStoreInstruction instruction) { PointerKey ref = h.getPointerKeyForLocal(n, instruction.getArrayRef()); for (InstanceKey i : pa.getPointsToSet(ref)) { result.add(h.getPointerKeyForArrayContents(i)); } }
@Override public void visitPropertyRead(AstPropertyRead instruction) { PointerKey obj = h.getPointerKeyForLocal(n, instruction.getObjectRef()); PointerKey prop = h.getPointerKeyForLocal(n, instruction.getMemberRef()); for(InstanceKey o : pa.getPointsToSet(obj)) { for(InstanceKey p : pa.getPointsToSet(prop)) { for(PointerKey x : Iterator2Iterable.make(h.getPointerKeysForReflectedFieldRead(o, p))) { assert x != null : instruction; result.add(x); } } } }
@Override public void visitPropertyRead(AstPropertyRead instruction) { PointerKey obj = h.getPointerKeyForLocal(n, instruction.getObjectRef()); PointerKey prop = h.getPointerKeyForLocal(n, instruction.getMemberRef()); for(InstanceKey o : pa.getPointsToSet(obj)) { for(InstanceKey p : pa.getPointsToSet(prop)) { for(PointerKey x : Iterator2Iterable.make(h.getPointerKeysForReflectedFieldRead(o, p))) { assert x != null : instruction; result.add(x); } } } }
@Override public void visitPropertyWrite(AstPropertyWrite instruction) { PointerKey obj = h.getPointerKeyForLocal(n, instruction.getObjectRef()); PointerKey prop = h.getPointerKeyForLocal(n, instruction.getMemberRef()); for(T o : pa.getPointsToSet(obj)) { for(T p : pa.getPointsToSet(prop)) { for(PointerKey x : Iterator2Iterable.make(h.getPointerKeysForReflectedFieldWrite(o, p))) { assert x != null : instruction; result.add(x); } } } } }
private static Set<Pair<CGNode, NewSiteReference>> getPropPrototypes(final PointerAnalysis<InstanceKey> fbPA, CallGraph CG, CGNode node, int vn) { return getPrototypeSites(fbPA, CG, o -> fbPA.getPointsToSet(new TransitivePrototypeKey(o)).iterator(), node, vn); }
@Test public void testMultiDim() throws ClassHierarchyException, IllegalArgumentException, CancelException, IOException { AnalysisScope scope = CallGraphTestUtil.makeJ2SEAnalysisScope(TestConstants.WALA_TESTDATA, CallGraphTestUtil.REGRESSION_EXCLUSIONS); ClassHierarchy cha = ClassHierarchyFactory.make(scope); Iterable<Entrypoint> entrypoints = com.ibm.wala.ipa.callgraph.impl.Util .makeMainEntrypoints(scope, cha, TestConstants.MULTI_DIM_MAIN); AnalysisOptions options = CallGraphTestUtil.makeAnalysisOptions(scope, entrypoints); CallGraphBuilder<InstanceKey> builder = Util.makeVanillaZeroOneCFABuilder(Language.JAVA, options, new AnalysisCacheImpl(),cha, scope); CallGraph cg = builder.makeCallGraph(options, null); PointerAnalysis<InstanceKey> pa = builder.getPointerAnalysis(); CGNode node = findDoNothingNode(cg); PointerKey pk = pa.getHeapModel().getPointerKeyForLocal(node, 1); OrdinalSet<InstanceKey> ptsTo = pa.getPointsToSet(pk); Assert.assertEquals(1, ptsTo.size()); }