protected PointsToSet reachingObjects(Local l) { PointsToSet ret = localToReachingObjects.get(l); if (ret == null) { localToReachingObjects.put(l, ret = pa.reachingObjects(l)); } return ret; }
for (Iterator<Local> receiverIt = receivers.iterator(); receiverIt.hasNext();) { final Local receiver = receiverIt.next(); final PointsToSet p2set = pa.reachingObjects(receiver); for (Iterator<Type> typeIt = p2set.possibleTypes().iterator(); typeIt.hasNext();) { final Type type = typeIt.next(); if (bases != null) { for (Local base : bases) { PointsToSet pts = pa.reachingObjects(base); for (Type ty : pts.possibleTypes()) { ofcgb.addBaseType(base, momc.context(), ty); if (argArrays != null) { for (final Local argArray : argArrays) { PointsToSet pts = pa.reachingObjects(argArray); if (pts instanceof PointsToSetInternal) { PointsToSetInternal ptsi = (PointsToSetInternal) pts; for (Iterator<Local> stringConstantIt = stringConstants.iterator(); stringConstantIt.hasNext();) { final Local stringConstant = stringConstantIt.next(); PointsToSet p2set = pa.reachingObjects(stringConstant); Collection<String> possibleStringConstants = p2set.possibleStringConstants(); if (possibleStringConstants == null) {
private void fill(Set<IdentityStmt> parms, IdentityStmt parm, int colour, PointsToAnalysis pa) { if (!parms.contains(parm)) { return; } parm.getRightOpBox().addTag(new ColorTag(colour, "Parameter Alias")); parms.remove(parm); PointsToSet ps = pa.reachingObjects((Local) parm.getLeftOp()); for (Iterator<IdentityStmt> parm2It = (new LinkedList<IdentityStmt>(parms)).iterator(); parm2It.hasNext();) { final IdentityStmt parm2 = parm2It.next(); if (ps.hasNonEmptyIntersection(pa.reachingObjects((Local) parm2.getLeftOp()))) { fill(parms, parm2, colour, pa); } } } }
protected void handleClass(PrintWriter out, SootClass c) { for (SootMethod m : c.getMethods()) { if (!m.isConcrete()) { continue; } Body b = m.retrieveActiveBody(); Local[] sortedLocals = b.getLocals().toArray(new Local[b.getLocalCount()]); Arrays.sort(sortedLocals, new StringComparator<Local>()); for (Local l : sortedLocals) { out.println("V " + m + l); if (l.getType() instanceof RefLikeType) { Set<Type> types = pa.reachingObjects(l).possibleTypes(); Type[] sortedTypes = types.toArray(new Type[types.size()]); Arrays.sort(sortedTypes, new StringComparator<Type>()); for (Type type : sortedTypes) { out.println("T " + type); } } } } } }
/** * Creates a new instance key representing the value stored in local, just before stmt. The identity of the key is defined * via lmaa, and its must-not-alias relationship to other keys via lmna. * * @param local * the local variable whose value this key represents * @param stmt * the statement at which this key represents the value * @param owner * the method containing local * @param lmaa * a {@link LocalMustAliasAnalysis} * @param lmna * a {@link LocalMustNotAliasAnalysis} */ public InstanceKey(Local local, Stmt stmt, SootMethod owner, LocalMustAliasAnalysis lmaa, LocalMustNotAliasAnalysis lmna) { this.assignedLocal = local; this.owner = owner; this.stmtAfterAssignStmt = stmt; this.lmaa = lmaa; this.lnma = lmna; PointsToAnalysis pta = Scene.v().getPointsToAnalysis(); this.pts = new PointsToSetEqualsWrapper((EqualsSupportingPointsToSet) pta.reachingObjects(local)); this.hashCode = computeHashCode(); }
lockPT = (PointsToSetInternal) pta.reachingObjects((Local) lock); } else if (lock instanceof StaticFieldRef) { lockPT = null; Local base = (Local) ((InstanceFieldRef) lock).getBase(); if (base instanceof FakeJimpleLocal) { lockPT = (PointsToSetInternal) pta.reachingObjects(((FakeJimpleLocal) base).getRealLocal(), ((FieldRef) lock).getField()); } else { lockPT = (PointsToSetInternal) pta.reachingObjects(base, ((FieldRef) lock).getField());
protected RWSet addValue(Value v, SootMethod m, Stmt s) { RWSet ret = null; if (v instanceof InstanceFieldRef) { InstanceFieldRef ifr = (InstanceFieldRef) v; PointsToSet base = pa.reachingObjects((Local) ifr.getBase()); ret = new StmtRWSet(); ret.addFieldRef(base, ifr.getField()); } else if (v instanceof StaticFieldRef) { StaticFieldRef sfr = (StaticFieldRef) v; ret = new StmtRWSet(); ret.addGlobal(sfr.getField()); } else if (v instanceof ArrayRef) { ArrayRef ar = (ArrayRef) v; PointsToSet base = pa.reachingObjects((Local) ar.getBase()); ret = new StmtRWSet(); ret.addFieldRef(base, PointsToAnalysis.ARRAY_ELEMENTS_NODE); } return ret; }
emptyEdge = !tn1.origLock.equals(tn2.origLock); } else { emptyEdge = !pta.reachingObjects((Local) tn1.origLock) .hasNonEmptyIntersection(pta.reachingObjects((Local) tn2.origLock));
if (v instanceof Local) { Local vLocal = (Local) v; PointsToSet base = pa.reachingObjects(vLocal);
PointsToSet base = pa.reachingObjects((Local) ifr.getBase()); ret = new StmtRWSet(); ret.addFieldRef(base, ifr.getField()); } else if (v instanceof ArrayRef) { ArrayRef ar = (ArrayRef) v; PointsToSet base = pa.reachingObjects((Local) ar.getBase()); ret = new StmtRWSet(); ret.addFieldRef(base, PointsToAnalysis.ARRAY_ELEMENTS_NODE); } else if (v instanceof Local) { Local vLocal = (Local) v; PointsToSet base = pa.reachingObjects(vLocal); ret = new CodeBlockRWSet(); CodeBlockRWSet stmtRW = new CodeBlockRWSet();
if (specialRead instanceof Local) { Local vLocal = (Local) specialRead; PointsToSet base = pa.reachingObjects(vLocal);
InstanceFieldRef ifr = (InstanceFieldRef) v; Local baseLocal = (Local) ifr.getBase(); PointsToSet base = pa.reachingObjects(baseLocal); if (baseLocal.getType() instanceof RefType) { SootClass baseClass = ((RefType) baseLocal.getType()).getSootClass(); } else if (v instanceof ArrayRef) { ArrayRef ar = (ArrayRef) v; PointsToSet base = pa.reachingObjects((Local) ar.getBase()); ret = new StmtRWSet(); ret.addFieldRef(base, PointsToAnalysis.ARRAY_ELEMENTS_NODE);
protected PointsToSet reachingObjects( Local l ) { PointsToSet ret = localToReachingObjects.get( l ); if( ret == null ) { localToReachingObjects.put( l, ret = pa.reachingObjects( l ) ); } return ret; }
protected PointsToSet reachingObjects( Local l ) { PointsToSet ret = localToReachingObjects.get( l ); if( ret == null ) { localToReachingObjects.put( l, ret = pa.reachingObjects( l ) ); } return ret; }
private void fill( Set<IdentityStmt> parms, IdentityStmt parm, int colour, PointsToAnalysis pa ) { if( !parms.contains(parm) ) return; parm.getRightOpBox().addTag( new ColorTag(colour, "Parameter Alias") ); parms.remove( parm ); PointsToSet ps = pa.reachingObjects( (Local) parm.getLeftOp() ); for( Iterator<IdentityStmt> parm2It = (new LinkedList<IdentityStmt>(parms)).iterator(); parm2It.hasNext(); ) { final IdentityStmt parm2 = parm2It.next(); if( ps.hasNonEmptyIntersection( pa.reachingObjects( (Local) parm2.getLeftOp() ) ) ) { fill( parms, parm2, colour, pa ); } } } }
private void fill( Set<IdentityStmt> parms, IdentityStmt parm, int colour, PointsToAnalysis pa ) { if( !parms.contains(parm) ) return; parm.getRightOpBox().addTag( new ColorTag(colour, "Parameter Alias") ); parms.remove( parm ); PointsToSet ps = pa.reachingObjects( (Local) parm.getLeftOp() ); for( Iterator<IdentityStmt> parm2It = (new LinkedList<IdentityStmt>(parms)).iterator(); parm2It.hasNext(); ) { final IdentityStmt parm2 = parm2It.next(); if( ps.hasNonEmptyIntersection( pa.reachingObjects( (Local) parm2.getLeftOp() ) ) ) { fill( parms, parm2, colour, pa ); } } } }
/** * Gets the points-to-set for the given access path * @param accessPath The access path for which to get the points-to-set * @return The points-to-set for the given access path */ private PointsToSet getPointsToSet(AccessPath accessPath) { if (accessPath.isLocal()) return Scene.v().getPointsToAnalysis().reachingObjects(accessPath.getPlainValue()); else if (accessPath.isInstanceFieldRef()) return Scene.v().getPointsToAnalysis().reachingObjects(accessPath.getPlainValue(), accessPath.getFirstField()); else if (accessPath.isStaticFieldRef()) return Scene.v().getPointsToAnalysis().reachingObjects(accessPath.getFirstField()); else throw new RuntimeException("Unexepected access path type"); }
/** * Gets the points-to-set for the given access path * @param accessPath The access path for which to get the points-to-set * @return The points-to-set for the given access path */ private PointsToSet getPointsToSet(AccessPath accessPath) { if (accessPath.isLocal()) return Scene.v().getPointsToAnalysis().reachingObjects(accessPath.getPlainValue()); else if (accessPath.isInstanceFieldRef()) return Scene.v().getPointsToAnalysis().reachingObjects(accessPath.getPlainValue(), accessPath.getFirstField()); else if (accessPath.isStaticFieldRef()) return Scene.v().getPointsToAnalysis().reachingObjects(accessPath.getFirstField()); else throw new RuntimeException("Unexepected access path type"); }
protected RWSet addValue( Value v, SootMethod m, Stmt s ) { RWSet ret = null; if( v instanceof InstanceFieldRef ) { InstanceFieldRef ifr = (InstanceFieldRef) v; PointsToSet base = pa.reachingObjects( (Local) ifr.getBase() ); ret = new StmtRWSet(); ret.addFieldRef( base, ifr.getField() ); } else if( v instanceof StaticFieldRef ) { StaticFieldRef sfr = (StaticFieldRef) v; ret = new StmtRWSet(); ret.addGlobal( sfr.getField() ); } else if( v instanceof ArrayRef ) { ArrayRef ar = (ArrayRef) v; PointsToSet base = pa.reachingObjects( (Local) ar.getBase() ); ret = new StmtRWSet(); ret.addFieldRef( base, PointsToAnalysis.ARRAY_ELEMENTS_NODE ); } return ret; }
protected RWSet addValue( Value v, SootMethod m, Stmt s ) { RWSet ret = null; if( v instanceof InstanceFieldRef ) { InstanceFieldRef ifr = (InstanceFieldRef) v; PointsToSet base = pa.reachingObjects( (Local) ifr.getBase() ); ret = new StmtRWSet(); ret.addFieldRef( base, ifr.getField() ); } else if( v instanceof StaticFieldRef ) { StaticFieldRef sfr = (StaticFieldRef) v; ret = new StmtRWSet(); ret.addGlobal( sfr.getField() ); } else if( v instanceof ArrayRef ) { ArrayRef ar = (ArrayRef) v; PointsToSet base = pa.reachingObjects( (Local) ar.getBase() ); ret = new StmtRWSet(); ret.addFieldRef( base, PointsToAnalysis.ARRAY_ELEMENTS_NODE ); } return ret; }