public static boolean hasNonEmptyIntersection(PointsToSet s1, PointsToSet s2) { if (s1 == null) { return false; } if (s1 instanceof Union) { return s1.hasNonEmptyIntersection(s2); } if (s2 == null) { return false; } return s2.hasNonEmptyIntersection(s1); }
public Set possibleTypes() { if (subsets == null) { return Collections.EMPTY_SET; } HashSet ret = new HashSet(); for (PointsToSet subset : subsets) { ret.addAll(subset.possibleTypes()); } return ret; }
public boolean isEmpty() { if (subsets == null) { return true; } for (PointsToSet subset : subsets) { if (!subset.isEmpty()) { return false; } } return true; }
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(); ofcgb.addType(receiver, momc.context(), type, null); for (Local base : bases) { PointsToSet pts = pa.reachingObjects(base); for (Type ty : pts.possibleTypes()) { ofcgb.addBaseType(base, momc.context(), ty); for (Type t : pa.reachingObjectsOfArrayElement(pts).possibleTypes()) { ofcgb.addInvokeArgType(argArray, momc.context(), t); final Local stringConstant = stringConstantIt.next(); PointsToSet p2set = pa.reachingObjects(stringConstant); Collection<String> possibleStringConstants = p2set.possibleStringConstants(); if (possibleStringConstants == null) { ofcgb.addStringConstant(stringConstant, momc.context(), null);
final Local receiver = (Local) receiverIt.next(); final PointsToSet p2set = pa.reachingObjects( receiver ); for( Iterator typeIt = p2set.possibleTypes().iterator(); typeIt.hasNext(); ) { final Type type = (Type) typeIt.next(); ofcgb.addType( receiver, momc.context(), type, null ); final Local stringConstant = (Local) stringConstantIt.next(); PointsToSet p2set = pa.reachingObjects( stringConstant ); Collection possibleStringConstants = p2set.possibleStringConstants(); if( possibleStringConstants == null ) { ofcgb.addStringConstant( stringConstant, momc.context(), null );
public boolean hasNonEmptyIntersection(PointsToSet other) { if (subsets == null) { return true; } for (PointsToSet subset : subsets) { if (other instanceof Union) { if (other.hasNonEmptyIntersection(subset)) { return true; } } else { if (subset.hasNonEmptyIntersection(other)) { return true; } } } return false; }
final Local receiver = (Local) receiverIt.next(); final PointsToSet p2set = pa.reachingObjects( receiver ); for( Iterator typeIt = p2set.possibleTypes().iterator(); typeIt.hasNext(); ) { final Type type = (Type) typeIt.next(); ofcgb.addType( receiver, momc.context(), type, null ); final Local stringConstant = (Local) stringConstantIt.next(); PointsToSet p2set = pa.reachingObjects( stringConstant ); Collection possibleStringConstants = p2set.possibleStringConstants(); if( possibleStringConstants == null ) { ofcgb.addStringConstant( stringConstant, momc.context(), null );
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); } } } } } }
/** Returns a set of base objects whose field f is read/written. */ public PointsToSet getBaseForField(Object f) { Union ret = null; for (RWSet s : sets) { PointsToSet os = s.getBaseForField(f); if (os == null) { continue; } if (os.isEmpty()) { continue; } if (ret == null) { ret = G.v().Union_factory.newUnion(); } ret.addAll(os); } return ret; }
/** * Are the two pointers an alias with context insensitive points-to information? */ public boolean isAliasCI(Local l1, Local l2) { PointsToSet pts1 = geomPTA.reachingObjects(l1); PointsToSet pts2 = geomPTA.reachingObjects(l2); return pts1.hasNonEmptyIntersection(pts2); }
for (Type ty : pag.reachingObjectsOfArrayElement(p2set).possibleTypes()) { ofcgb.addInvokeArgType(receiver, context, ty);
/** Returns a set of base objects whose field f is read/written. */ public PointsToSet getBaseForField( Object f ) { Union ret = null; for (RWSet s : sets) { PointsToSet os = s.getBaseForField( f ); if( os == null ) continue; if( os.isEmpty() ) continue; if( ret == null ) ret = G.v().Union_factory.newUnion(); ret.addAll( os ); } return ret; }
/** * {@inheritDoc} */ public boolean mayNotAlias(InstanceKey otherKey) { if (owner.equals(otherKey.owner) && stmtAfterAssignStmt != null && otherKey.stmtAfterAssignStmt != null) { if (lnma.notMayAlias(assignedLocal, stmtAfterAssignStmt, otherKey.assignedLocal, otherKey.stmtAfterAssignStmt)) { return true; } } // different methods or local not-may-alias was not successful: get points-to info PointsToAnalysis pta = Scene.v().getPointsToAnalysis(); if (pta == null) { return false; // no info; hence don't know for sure } // may not alias if we have an empty intersection return !pts.hasNonEmptyIntersection(otherKey.pts); }
protected void handleClass( PrintWriter out, SootClass c ) { for( Iterator mIt = c.methodIterator(); mIt.hasNext(); ) { final SootMethod m = (SootMethod) mIt.next(); if( !m.isConcrete() ) continue; Body b = m.retrieveActiveBody(); TreeSet sortedLocals = new TreeSet( new StringComparator() ); sortedLocals.addAll( b.getLocals() ); for( Iterator lIt = sortedLocals.iterator(); lIt.hasNext(); ) { final Local l = (Local) lIt.next(); out.println( "V "+m+l ); if( l.getType() instanceof RefLikeType ) { Set types = pa.reachingObjects( l ).possibleTypes(); TreeSet sortedTypes = new TreeSet( new StringComparator() ); sortedTypes.addAll( types ); for( Iterator tIt = sortedTypes.iterator(); tIt.hasNext(); ) { out.println( "T "+tIt.next() ); } } } } } class StringComparator implements Comparator {
/** Returns a set of base objects whose field f is read/written. */ public PointsToSet getBaseForField( Object f ) { Union ret = null; for (RWSet s : sets) { PointsToSet os = s.getBaseForField( f ); if( os == null ) continue; if( os.isEmpty() ) continue; if( ret == null ) ret = G.v().Union_factory.newUnion(); ret.addAll( os ); } return ret; }
public boolean hasNonEmptyIntersection(PointsToSet other) { if (other instanceof AllocAndContextSet) { return other.hasNonEmptyIntersection(this); } else if (other instanceof WrappedPointsToSet) { return hasNonEmptyIntersection(((WrappedPointsToSet) other).getWrapped()); } else { return wrapped.hasNonEmptyIntersection(other); } }
protected void handleClass( PrintWriter out, SootClass c ) { for( Iterator mIt = c.methodIterator(); mIt.hasNext(); ) { final SootMethod m = (SootMethod) mIt.next(); if( !m.isConcrete() ) continue; Body b = m.retrieveActiveBody(); TreeSet sortedLocals = new TreeSet( new StringComparator() ); sortedLocals.addAll( b.getLocals() ); for( Iterator lIt = sortedLocals.iterator(); lIt.hasNext(); ) { final Local l = (Local) lIt.next(); out.println( "V "+m+l ); if( l.getType() instanceof RefLikeType ) { Set types = pa.reachingObjects( l ).possibleTypes(); TreeSet sortedTypes = new TreeSet( new StringComparator() ); sortedTypes.addAll( types ); for( Iterator tIt = sortedTypes.iterator(); tIt.hasNext(); ) { out.println( "T "+tIt.next() ); } } } } } class StringComparator implements Comparator {
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); } } } }
.possibleTypes(); for (Type possibleType : possibleTypes) { RefType baseType;
} else if (pts2 instanceof FullObjectSet) { ret.addFieldRef(pts1, field); } else if (pts1.hasNonEmptyIntersection(pts2)) { if ((pts1 instanceof PointsToSetInternal) && (pts2 instanceof PointsToSetInternal)) { final PointsToSetInternal pti1 = (PointsToSetInternal) pts1;