@Override public PointerKey getPointerKeyForArrayContents(InstanceKey I) { return delegate.getPointerKeyForArrayContents(I); }
@Override public PointerKey getPointerKeyForArrayContents(InstanceKey I) { return delegate.getPointerKeyForArrayContents(I); }
@Override public PointerKey getPointerKeyForArrayContents(InstanceKey I) { if (I == null) { throw new IllegalArgumentException("I is null"); } return h.getPointerKeyForArrayContents(I); }
@Override public PointerKey getPointerKeyForArrayContents(InstanceKey I) { if (I == null) { throw new IllegalArgumentException("I is null"); } return h.getPointerKeyForArrayContents(I); }
@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> 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> getArrayWrites(PointerKey arrayRef) { Collection<MemoryAccess> memAccesses = new ArrayList<>(); if (DEBUG) { System.err.println(("looking at writes to array ref " + arrayRef)); } for (InstanceKey ik : pa.getPointsToSet(arrayRef)) { if (DEBUG) { System.err.println(("instance key " + ik + " class " + ik.getClass())); } PointerKey ack = heapModel.getPointerKeyForArrayContents(ik); convertStmtsToMemoryAccess(invMod.get(ack), memAccesses); } return memAccesses; }
@Override public Collection<MemoryAccess> getArrayWrites(PointerKey arrayRef) { Collection<MemoryAccess> memAccesses = new ArrayList<>(); if (DEBUG) { System.err.println(("looking at writes to array ref " + arrayRef)); } for (InstanceKey ik : pa.getPointsToSet(arrayRef)) { if (DEBUG) { System.err.println(("instance key " + ik + " class " + ik.getClass())); } PointerKey ack = heapModel.getPointerKeyForArrayContents(ik); convertStmtsToMemoryAccess(invMod.get(ack), memAccesses); } return memAccesses; }
/** * convert a pointer key to one in the memory access map's heap model * * TODO move this somewhere more appropriate * * @throws UnsupportedOperationException if it doesn't know how to handle a {@link PointerKey} */ public static PointerKey convertPointerKeyToHeapModel(PointerKey pk, HeapModel h) { if (pk == null) { throw new IllegalArgumentException("null pk"); } if (pk instanceof LocalPointerKey) { LocalPointerKey lpk = (LocalPointerKey) pk; return h.getPointerKeyForLocal(lpk.getNode(), lpk.getValueNumber()); } else if (pk instanceof ArrayContentsKey) { ArrayContentsKey ack = (ArrayContentsKey) pk; InstanceKey ik = ack.getInstanceKey(); if (ik instanceof NormalAllocationInNode) { NormalAllocationInNode nain = (NormalAllocationInNode) ik; ik = h.getInstanceKeyForAllocation(nain.getNode(), nain.getSite()); } else { assert false : "need to handle " + ik.getClass(); } return h.getPointerKeyForArrayContents(ik); } else if (pk instanceof ReturnValueKey) { ReturnValueKey rvk = (ReturnValueKey) pk; return h.getPointerKeyForReturnValue(rvk.getNode()); } throw new UnsupportedOperationException("need to handle " + pk.getClass()); }
/** * convert a pointer key to one in the memory access map's heap model * * TODO move this somewhere more appropriate * * @throws UnsupportedOperationException if it doesn't know how to handle a {@link PointerKey} */ public static PointerKey convertPointerKeyToHeapModel(PointerKey pk, HeapModel h) { if (pk == null) { throw new IllegalArgumentException("null pk"); } if (pk instanceof LocalPointerKey) { LocalPointerKey lpk = (LocalPointerKey) pk; return h.getPointerKeyForLocal(lpk.getNode(), lpk.getValueNumber()); } else if (pk instanceof ArrayContentsKey) { ArrayContentsKey ack = (ArrayContentsKey) pk; InstanceKey ik = ack.getInstanceKey(); if (ik instanceof NormalAllocationInNode) { NormalAllocationInNode nain = (NormalAllocationInNode) ik; ik = h.getInstanceKeyForAllocation(nain.getNode(), nain.getSite()); } else { assert false : "need to handle " + ik.getClass(); } return h.getPointerKeyForArrayContents(ik); } else if (pk instanceof ReturnValueKey) { ReturnValueKey rvk = (ReturnValueKey) pk; return h.getPointerKeyForReturnValue(rvk.getNode()); } throw new UnsupportedOperationException("need to handle " + pk.getClass()); }
pa.getPointsToSet(pa.getHeapModel().getPointerKeyForArrayContents(ik)); if (pointsToSet.isEmpty()) {
PointerKey pk = heapModel.getPointerKeyForArrayContents(lastInstance);
PointerKey pk = heapModel.getPointerKeyForArrayContents(lastInstance);
PointerKey p = getHeapModel().getPointerKeyForArrayContents(I); if (p == null || !nodeManager.containsNode(p)) { return null;
PointerKey p = getHeapModel().getPointerKeyForArrayContents(I); if (p == null || !nodeManager.containsNode(p)) { return null;
PointerKey pk = heapModel.getPointerKeyForArrayContents(lastInstance); addNode(ik); addNode(pk);
PointerKey pk = heapModel.getPointerKeyForArrayContents(lastInstance); addNode(ik); addNode(pk);
if (type.isArrayClass()) { if (((ArrayClass) type).getElementClass() != null) { PointerKey fk = heapModel.getPointerKeyForArrayContents(key); OrdinalSet<? extends InstanceKey> fobjects = pa.getPointsToSet(fk); for (InstanceKey fobj : fobjects) {
@Test public void testZeroLengthArray() 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.ZERO_LENGTH_ARRAY_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(); // System.err.println(pa); HeapModel heapModel = pa.getHeapModel(); CGNode mainNode = cg.getNode( cha.resolveMethod(MethodReference.findOrCreate( TypeReference.findOrCreate(ClassLoaderReference.Application, TestConstants.ZERO_LENGTH_ARRAY_MAIN), Selector.make("main([Ljava/lang/String;)V"))), Everywhere.EVERYWHERE); OrdinalSet<InstanceKey> pointsToSet = pa.getPointsToSet(heapModel.getPointerKeyForLocal(mainNode, 4)); Assert.assertEquals(1, pointsToSet.size()); InstanceKey arrayKey = pointsToSet.iterator().next(); OrdinalSet<InstanceKey> arrayContents = pa.getPointsToSet(heapModel.getPointerKeyForArrayContents(arrayKey)); System.err.println(arrayContents); Assert.assertEquals(0, arrayContents.size()); } }