Java 类soot.jimple.spark.sets.PointsToSetInternal 实例源码

项目:JAADAS    文件:SootUtil.java   
public static PointsToSetInternal constructIntersection(final PointsToSetInternal set1, final PointsToSetInternal set2, PAG pag) {
  HybridPointsToSet hybridSet1 = null, hybridSet2 = null;
  hybridSet1 = convertToHybrid(set1);
  hybridSet2 = convertToHybrid(set2);
  HybridPointsToSet intersection = HybridPointsToSet.intersection(hybridSet1, hybridSet2, pag);
  // checkSetsEqual(intersection, set1, set2, pag);
  return intersection;

}
项目:JAADAS    文件:SootUtil.java   
private static HybridPointsToSet convertToHybrid(final PointsToSetInternal set) {
  HybridPointsToSet ret = null;
  if (set instanceof HybridPointsToSet) {
    ret = (HybridPointsToSet) set;
  } else if (set instanceof DoublePointsToSet) {
    assert ((DoublePointsToSet) set).getNewSet().isEmpty();
    ret = (HybridPointsToSet) ((DoublePointsToSet) set).getOldSet();
  }
  return ret;
}
项目:JAADAS    文件:DemandCSPointsTo.java   
public PointsToSet reachingObjects(Local l) {
    if(lazy)
        /*
         * create a lazy points-to set; this will not actually compute context information until we ask whether this points-to set
         * has a non-empty intersection with another points-to set and this intersection appears to be non-empty; when this is the case
         * then the points-to set will call doReachingObjects(..) to refine itself
         */         
        return new LazyContextSensitivePointsToSet(l,new WrappedPointsToSet((PointsToSetInternal) pag.reachingObjects(l)),this);
    else
        return doReachingObjects(l);
}
项目:JAADAS    文件:DemandCSPointsTo.java   
protected PointsToSetInternal checkContextsForAllocsCache(
        VarAndContext varAndContext, AllocAndContextSet ret,
        PointsToSetInternal locs) {
    PointsToSetInternal retSet = null;
    if (contextsForAllocsCache.containsKey(varAndContext)) {
        for (AllocAndContext allocAndContext : contextsForAllocsCache.get(
                varAndContext).getO2()) {
            if (locs.contains(allocAndContext.alloc)) {
                ret.add(allocAndContext);
            }
        }
        final PointsToSetInternal oldLocs = contextsForAllocsCache.get(
                varAndContext).getO1();
        final PointsToSetInternal tmpSet = new HybridPointsToSet(locs
                .getType(), pag);
        locs.forall(new P2SetVisitor() {

            @Override
            public void visit(Node n) {
                if (!oldLocs.contains(n)) {
                    tmpSet.add(n);
                }
            }
        });
        retSet = tmpSet;
        oldLocs.addAll(tmpSet, null);
    } else {
        PointsToSetInternal storedSet = new HybridPointsToSet(locs
                .getType(), pag);
        storedSet.addAll(locs, null);
        contextsForAllocsCache.put(varAndContext,
                new Pair<PointsToSetInternal, AllocAndContextSet>(
                        storedSet, new AllocAndContextSet()));
        retSet = locs;
    }
    return retSet;
}
项目:JAADAS    文件:DemandCSPointsTo.java   
@SuppressWarnings("unchecked")
protected Set<SootMethod> getCallTargets(PointsToSetInternal p2Set,
        NumberedString methodStr, Type receiverType,
        Set<SootMethod> possibleTargets) {
    List<Object> args = Arrays.asList(p2Set, methodStr, receiverType,
            possibleTargets);
    if (callTargetsArgCache.containsKey(args)) {
        return callTargetsArgCache.get(args);
    }
    Set<Type> types = p2Set.possibleTypes();
    Set<SootMethod> ret = new HashSet<SootMethod>();
    for (Type type : types) {
        ret.addAll(getCallTargetsForType(type, methodStr, receiverType,
                possibleTargets));
    }
    callTargetsArgCache.put(args, ret);
    return ret;
}
项目:JAADAS    文件:DemandCSPointsTo.java   
@SuppressWarnings("unused")
protected Set<VarNode> nodesPropagatedThrough(final VarNode source,
        final PointsToSetInternal allocs) {
    final Set<VarNode> marked = new HashSet<VarNode>();
    final Stack<VarNode> worklist = new Stack<VarNode>();
    Propagator<VarNode> p = new Propagator<VarNode>(marked, worklist);
    p.prop(source);
    while (!worklist.isEmpty()) {
        VarNode curNode = worklist.pop();
        Node[] assignSources = pag.simpleInvLookup(curNode);
        for (int i = 0; i < assignSources.length; i++) {
            VarNode assignSrc = (VarNode) assignSources[i];
            if (assignSrc.getP2Set().hasNonEmptyIntersection(allocs)) {
                p.prop(assignSrc);
            }
        }
        Set<VarNode> matchSources = vMatches.vMatchInvLookup(curNode);
        for (VarNode matchSrc : matchSources) {
            if (matchSrc.getP2Set().hasNonEmptyIntersection(allocs)) {
                p.prop(matchSrc);
            }
        }
    }
    return marked;
}
项目:JAADAS    文件:DemandCSPointsTo.java   
protected boolean refineAlias(VarNode v1, VarNode v2,
        PointsToSetInternal intersection, HeuristicType heuristic) {
    if (refineAliasInternal(v1, v2, intersection, heuristic))
        return true;
    if (refineAliasInternal(v2, v1, intersection, heuristic))
        return true;
    return false;
}
项目:JAADAS    文件:DemandCSPointsTo.java   
protected boolean refineP2Set(VarNode v, PointsToSetInternal badLocs,
        HeuristicType heuristic) {
    // G.v().out.println(badLocs);
    this.doPointsTo = false;
    this.fieldCheckHeuristic = HeuristicType.getHeuristic(heuristic, pag
            .getTypeManager(), getMaxPasses());
    try {
        numPasses = 0;
        while (true) {
            numPasses++;
            if (DEBUG_PASS != -1 && numPasses > DEBUG_PASS) {
                return false;
            }
            if (numPasses > maxPasses) {
                return false;
            }
            if (DEBUG) {
                G.v().out.println("PASS " + numPasses);
                G.v().out.println(fieldCheckHeuristic);
            }
            clearState();
            boolean success = false;
            try {
                success = refineP2Set(
                        new VarAndContext(v, EMPTY_CALLSTACK), badLocs);
            } catch (TerminateEarlyException e) {
                success = false;
            }
            if (success) {

                return true;
            } else {
                if (!fieldCheckHeuristic.runNewPass()) {
                    return false;
                }
            }
        }
    } finally {
    }
}
项目:JAADAS    文件:AllocAndContextSet.java   
public boolean hasNonEmptyIntersection(PointsToSet other) {
  if (other instanceof AllocAndContextSet) {
    return nonEmptyHelper((AllocAndContextSet) other);
  } else if (other instanceof WrappedPointsToSet) {
    return hasNonEmptyIntersection(((WrappedPointsToSet) other).getWrapped());
  } else if (other instanceof PointsToSetInternal) {
    return ((PointsToSetInternal) other).forall(new P2SetVisitor() {

      @Override
      public void visit(Node n) {
        if (!returnValue) {
          for (AllocAndContext allocAndContext : AllocAndContextSet.this) {
            if (n.equals(allocAndContext.alloc)) {
              returnValue = true;
              break;
            }
          }
        }
      }

    });
  }
  throw new UnsupportedOperationException("can't check intersection with set of type " + other.getClass());
}
项目:JAADAS    文件:GeomPointsTo.java   
/**
 * For many applications, they only need the context insensitive points-to result.
 * We provide a way to transfer our result back to SPARK.
 * After the transformation, we discard the context sensitive points-to information.
 * Therefore, if context sensitive queries are needed in future, please call ddSolve() for queried pointers first. 
 */
public void transformToCIResult()
{   
    for ( IVarAbstraction pn : pointers ) {
        if ( pn.getRepresentative() != pn ) continue;

        Node node = pn.getWrappedNode();
        node.discardP2Set();
        PointsToSetInternal ptSet = node.makeP2Set();
        for ( AllocNode obj : pn.get_all_points_to_objects() ) {
            ptSet.add( obj );
        }

        pn.deleteAll();
    }

    hasTransformed = true;
}
项目:JAADAS    文件:StartJoinAnalysis.java   
private List<AllocNode> getMayAliasList(PointsToSetInternal pts)
{
    List<AllocNode> list = new ArrayList<AllocNode>();
    final HashSet<AllocNode> ret = new HashSet<AllocNode>();
    pts.forall( new P2SetVisitor() {
        public void visit( Node n ) {

            ret.add( (AllocNode)n );
        }
    } );
    Iterator<AllocNode> it = ret.iterator();
    while (it.hasNext()){
        list.add( it.next() );
    }
    return list;
}
项目:tsa    文件:ThreadSharingAnalyzer.java   
private boolean isArrayAccessShared(Local local)
{
PointsToSetInternal pts = (PointsToSetInternal) pag.reachingObjects(local);
return pts.forall(new P2SetVisitor() {

    boolean isShared ;
         @Override
         public void visit(Node n) {
           if(!isShared)
           {
            int id = n.getNumber();
            XNode xn = indexNodeMap.get(id);
            if(xn!=null)
                isShared = xn.isArrayShared();
           }
         }
         @Override
         public boolean getReturnValue()
         {
          return isShared;
         }
     }); 
}
项目:tsa    文件:ThreadSharingAnalyzer.java   
private void accessArray(Local local, final boolean isWrite)
{
PointsToSetInternal pts = (PointsToSetInternal) pag.reachingObjects(local);
pts.forall(new P2SetVisitor() {
        @Override
        public void visit(Node n) {

            int id = n.getNumber();
            XNode xn = indexNodeMap.get(id);
            if(xn==null)
            {
                xn = new XNode();
                indexNodeMap.put(id,xn);
            }
            xn.accessArray(currentThreadID,isWrite);
            if(currentThread.runsMany)
            {
                xn.accessArray((byte) (currentThreadID+1),isWrite);
            }

        }
    }); 
}
项目:tsa    文件:ThreadSharingAnalyzer.java   
private void accessField(Local local, final SootField sf, final boolean isWrite)
{
 PointsToSetInternal pts = (PointsToSetInternal) pag.reachingObjects(local);
pts.forall(new P2SetVisitor() {
        @Override
        public void visit(Node n) {

            int id = n.getNumber();
            XNode xn = indexNodeMap.get(id);
            if(xn==null)
            {
                xn = new XNode();
                indexNodeMap.put(id,xn);
            }

        accessField(id,sf,isWrite);

        }
    });                 
}
项目:tsa    文件:StartJoinAnalysisX.java   
private List<AllocNode> getMayAliasList(PointsToSetInternal pts)
{
    List<AllocNode> list = new ArrayList<AllocNode>();
    final HashSet<AllocNode> ret = new HashSet<AllocNode>();
    pts.forall( new P2SetVisitor() {
        public void visit( Node n ) {

            ret.add( (AllocNode)n );
        }
    } );
    Iterator<AllocNode> it = ret.iterator();
    while (it.hasNext()){
        list.add( it.next() );
    }
    return list;
}
项目:JAADAS    文件:Node.java   
/** Returns the points-to set for this node. */
public PointsToSetInternal getP2Set() {
    if( p2set != null ) {
        if( replacement != this ) throw new RuntimeException(
                "Node "+this+" has replacement "+replacement+" but has p2set" );
        return p2set;
    }
    Node rep = getReplacement();
    if( rep == this ) {
        return EmptyPointsToSet.v();
    }
    return rep.getP2Set();
}
项目:JAADAS    文件:Node.java   
/** Returns the points-to set for this node, makes it if necessary. */
public PointsToSetInternal makeP2Set() {
    if( p2set != null ) {
        if( replacement != this ) throw new RuntimeException(
                "Node "+this+" has replacement "+replacement+" but has p2set" );
        return p2set;
    }
    Node rep = getReplacement();
    if( rep == this ) {
        p2set = pag.getSetFactory().newSet( type, pag );
    }
    return rep.makeP2Set();
}
项目:JAADAS    文件:MergeChecker.java   
protected void checkAll( final Node container, PointsToSetInternal nodes,
        final Node upstream ) {
    nodes.forall( new P2SetVisitor() {
    public final void visit( Node n ) {
            checkNode( container, n, upstream );
        }
    } );
}
项目:JAADAS    文件:MergeChecker.java   
protected void checkNode( Node container, Node n, Node upstream ) {
    if( container.getReplacement() != container )
        throw new RuntimeException( "container "+container+" is illegal" );
    if( upstream.getReplacement() != upstream )
        throw new RuntimeException( "upstream "+upstream+" is illegal" );
    PointsToSetInternal p2set = container.getP2Set();
    FastHierarchy fh = pag.getTypeManager().getFastHierarchy();
    if( !p2set.contains( n ) 
            && ( fh == null || container.getType() == null ||
            fh.canStoreType( n.getType(), container.getType() ) ) ) {
        G.v().out.println( "Check failure: "+container+" does not have "+n
                +"; upstream is "+upstream );
    }
}
项目:JAADAS    文件:MergeChecker.java   
protected void handleSimples( VarNode src ) {
PointsToSetInternal srcSet = src.getP2Set();
if( srcSet.isEmpty() ) return;
final Node[] simpleTargets = pag.simpleLookup( src );
for (Node element : simpleTargets) {
           checkAll( element, srcSet, src );
}
   }
项目:JAADAS    文件:MergeChecker.java   
protected void handleStores( final VarNode src ) {
final PointsToSetInternal srcSet = src.getP2Set();
if( srcSet.isEmpty() ) return;
Node[] storeTargets = pag.storeLookup( src );
for (Node element : storeTargets) {
           final FieldRefNode fr = (FieldRefNode) element;
           checkAll( fr, srcSet, src );
}
   }
项目:JAADAS    文件:MergeChecker.java   
protected void handleLoads( final FieldRefNode src ) {
final Node[] loadTargets = pag.loadLookup( src );
       PointsToSetInternal set = src.getP2Set();
       if( set.isEmpty() ) return;
       for (Node element : loadTargets) {
           VarNode target = (VarNode) element;
           checkAll( target, set, src );
       }
   }
项目:JAADAS    文件:SCCCollapser.java   
final protected void dfsVisit( VarNode v, VarNode rootOfSCC ) {
    if( visited.contains( v ) ) return;
    visited.add( v );
    Node[] succs = pag.simpleInvLookup( v );
    for (Node element : succs) {
        if( ignoreTypes
        || typeManager.castNeverFails( element.getType(), v.getType() ) ) {
            dfsVisit( (VarNode) element, rootOfSCC );
        }
    }
    if( v != rootOfSCC ) {
        if( !ignoreTypes ) {
            if( typeManager.castNeverFails(
                        v.getType(), rootOfSCC.getType() )
             && typeManager.castNeverFails(
                        rootOfSCC.getType(), v.getType() ) ) {
                rootOfSCC.mergeWith( v );
                numCollapsed++;
            }
        } else /* ignoreTypes */ {
            if( typeManager.castNeverFails(
                        v.getType(), rootOfSCC.getType() ) ) {
                rootOfSCC.mergeWith( v );
            } else if( typeManager.castNeverFails(
                        rootOfSCC.getType(), v.getType() ) ) {
                v.mergeWith( rootOfSCC );
            } else {
                rootOfSCC.getReplacement().setType( null );
                PointsToSetInternal set = rootOfSCC.getP2Set();
                if( set != null ) {
                    set.setType( null );
                }
                rootOfSCC.mergeWith( v );
            }
            numCollapsed++;
        }
    }
}
项目:JAADAS    文件:PtSensVisitor.java   
/**
 * Transform the result to SPARK style context insensitive points-to set.
 * The transformed result is stored in the points-to set of the querying pointer.
 * @param vn: the querying pointer
 * @return
 */
public PointsToSet toSparkCompatiableResult(VarNode vn)
{
    if ( !readyToUse) finish();

    PointsToSetInternal ptset = vn.makeP2Set();

    for ( VarType cv : outList ) {
        ptset.add(cv.var);
    }

    return ptset;
}
项目:JAADAS    文件:GeomPointsTo.java   
private PointsToSetInternal field_p2set( PointsToSet s, final SparkField f )
{
    if ( !(s instanceof PointsToSetInternal) )
        throw new RuntimeException( "Base pointers must be stored in *PointsToSetInternal*." );

    PointsToSetInternal bases = (PointsToSetInternal) s;
    final PointsToSetInternal ret = getSetFactory().newSet(f.getType(), this);

    bases.forall(new P2SetVisitor() {
        public final void visit(Node n) {
            Node nDotF = ((AllocNode) n).dot(f);
            if (nDotF != null) {
                //nDotF.getP2Set() has been discarded in solve()
                IVarAbstraction pn = consG.get(nDotF);
                if (pn == null
                        || hasTransformed 
                        || nDotF.getP2Set() != EmptyPointsToSet.v()) {
                    ret.addAll(nDotF.getP2Set(), null);
                    return;
                }

                pn = pn.getRepresentative();
                //PointsToSetInternal ptSet = nDotF.makeP2Set();
                for ( AllocNode obj : pn.get_all_points_to_objects() ) {
                    ret.add( obj );
                    //ptSet.add(obj);
                }
            }
        }
    });

    return ret;
}
项目:JAADAS    文件:GeomPointsTo.java   
@Override
public PointsToSet reachingObjects(Local l) 
{
    if ( !hasExecuted ) return super.reachingObjects(l);

    LocalVarNode vn = findLocalVarNode(l);
    if ( vn == null ) 
        return EmptyPointsToSet.v();

    IVarAbstraction pn = consG.get(vn);

    // In case this pointer has no geomPTA result
    // This is perhaps a bug
    if ( pn == null ) 
        return vn.getP2Set();

    // Return the cached result
    if ( hasTransformed ||
            vn.getP2Set() != EmptyPointsToSet.v() ) return vn.getP2Set();

    // Compute and cache the result
    pn = pn.getRepresentative();
    PointsToSetInternal ptSet = vn.makeP2Set();
    for ( AllocNode obj : pn.get_all_points_to_objects() ) {
        ptSet.add( obj );
    }

    return ptSet;
}
项目:JAADAS    文件:GeomPointsTo.java   
@Override
public PointsToSet reachingObjects(SootField f) 
{
    if ( !hasExecuted ) return super.reachingObjects(f);

    if( !f.isStatic() )
           throw new RuntimeException( "The parameter f must be a *static* field." );

       VarNode vn = findGlobalVarNode( f );
       if ( vn == null ) 
        return EmptyPointsToSet.v();

       IVarAbstraction pn = consG.get(vn);
       if( pn == null ) 
        return vn.getP2Set();

       // Lookup the cache
       if ( hasTransformed ||
        vn.getP2Set() != EmptyPointsToSet.v() ) return vn.getP2Set();   

       // We transform and cache the result for the next query
    pn = pn.getRepresentative();
    PointsToSetInternal ptSet = vn.makeP2Set();
    for ( AllocNode obj : pn.getRepresentative().get_all_points_to_objects() ) {
        ptSet.add( obj );
    }

    return ptSet;
}
项目:JAADAS    文件:GeomPointsTo.java   
public PointsToSet reachingObjects(AllocNode an, SootField f)
{
    AllocDotField adf = an.dot(f);
    IVarAbstraction pn = consG.get(adf);

    // No such pointer seen by SPARK
    if ( adf == null )
        return EmptyPointsToSet.v();

    // Not seen by geomPTA
    if ( pn == null )
        return adf.getP2Set();

    if ( hasTransformed ||
            adf.getP2Set() != EmptyPointsToSet.v() ) return adf.getP2Set(); 

        // We transform and cache the result for the next query
        pn = pn.getRepresentative();
        PointsToSetInternal ptSet = adf.makeP2Set();
        for ( AllocNode obj : pn.getRepresentative().get_all_points_to_objects() ) {
            ptSet.add( obj );
    }

    return ptSet;
}
项目:matos-tool    文件:ArrayAnalysis.java   
/**
 * Builds an abstraction for the contents of an array. It is called on registered arrays.
 * @param nt
 * @param node
 */
public void resolveArray(NodeTable nt, AllocNode node) {
    if (pag == null) return;
    int id = node.getNumber();
    // Even if type stratification was defeated, we will not loop on an array containing itself.
    if (seen.contains(id)) return;
    seen.add(id);
    P2SetFactory ptsf = pag.getSetFactory();
    PointsToSetInternal pts = ptsf.newSet(node.getType(), pag);
    pts.add(node);
    PointsToSet contents = pag.reachingObjectsOfArrayElement(pts);
    AbsValue av = P2SAux.p2sContents(nt, contents);
    repositoryOtherArrays.put(id, av);
}
项目:matos-tool    文件:P2SAux.java   
/**
 * Check if a points to set is non empty.
 * @param ptsRaw
 * @param m
 * @param obj
 */
public static void check (PointsToSet ptsRaw, SootMethod m, Unit st) {
    if (!(ptsRaw instanceof PointsToSetInternal)) return;
    PointsToSetInternal pts = (PointsToSetInternal) ptsRaw;
    if ((pts.size() != 0 && pts.getType() != null)) return;
    /*
    CallGraph cg = Scene.v().getCallGraph();
    System.out.println("**********" + st + "***************");
    showAncestor(cg,st, m,1 );
    */
}
项目:JAADAS    文件:WrappedPointsToSet.java   
public PointsToSetInternal getWrapped() {
  return wrapped;
}
项目:JAADAS    文件:WrappedPointsToSet.java   
public WrappedPointsToSet(final PointsToSetInternal wrapped) {
  super();
  this.wrapped = wrapped;
}
项目:JAADAS    文件:AllocationSiteHandler.java   
public PointsToSetInternal getP2set() {
  return p2set;
}
项目:JAADAS    文件:AllocationSiteHandler.java   
public void setP2set(PointsToSetInternal p2set) {
  this.p2set = p2set;
}
项目:JAADAS    文件:DemandCSPointsTo.java   
public abstract void handleMatchSrc(VarNode matchSrc,
PointsToSetInternal intersection, VarNode loadBase,
VarNode storeBase, VarAndContext origVarAndContext,
SparkField field, boolean refine);
项目:JAADAS    文件:DemandCSPointsTo.java   
protected boolean refineAliasInternal(VarNode v1, VarNode v2,
        PointsToSetInternal intersection, HeuristicType heuristic) {
    this.fieldCheckHeuristic = HeuristicType.getHeuristic(heuristic, pag
            .getTypeManager(), getMaxPasses());
    numPasses = 0;
    while (true) {
        numPasses++;
        if (DEBUG_PASS != -1 && numPasses > DEBUG_PASS) {
            return false;
        }
        if (numPasses > maxPasses) {
            return false;
        }
        if (DEBUG) {
            G.v().out.println("PASS " + numPasses);
            G.v().out.println(fieldCheckHeuristic);
        }
        clearState();
        boolean success = false;
        try {
            AllocAndContextSet allocAndContexts = findContextsForAllocs(
                    new VarAndContext(v1, EMPTY_CALLSTACK), intersection);
            boolean emptyIntersection = true;
            for (AllocAndContext allocAndContext : allocAndContexts) {
                CallingContextSet upContexts = findUpContextsForVar(
                        allocAndContext, new VarContextAndUp(v2,
                                EMPTY_CALLSTACK, EMPTY_CALLSTACK));
                if (!upContexts.isEmpty()) {
                    emptyIntersection = false;
                    break;
                }
            }
            success = emptyIntersection;
        } catch (TerminateEarlyException e) {
            success = false;
        }
        if (success) {
            G.v().out.println("took " + numPasses + " passes");
            return true;
        } else {
            if (!fieldCheckHeuristic.runNewPass()) {
                return false;
            }
        }
    }
}
项目:JAADAS    文件:Node.java   
/** Use the specified points-to set to replace current one */
public void setP2Set( PointsToSetInternal ptsInternal )
{
    p2set = ptsInternal;
}
项目:JAADAS    文件:GeomPointsTo.java   
@Override
public PointsToSet reachingObjects(Context c, Local l) 
{
    if ( !hasExecuted ) return super.reachingObjects(c, l);

    if ( hasTransformed ||
            !(c instanceof Unit) )
        return reachingObjects(l);

    LocalVarNode vn = findLocalVarNode(l);
    if ( vn == null ) 
        return EmptyPointsToSet.v();

    // Lookup the context sensitive points-to information for this pointer
    IVarAbstraction pn = consG.get(vn);
    if ( pn == null ) 
        return vn.getP2Set();

    pn = pn.getRepresentative();

    // Obtain the context sensitive points-to result
    SootMethod callee = vn.getMethod();
    Edge e = Scene.v().getCallGraph().findEdge((Unit) c, callee);
    if (e == null)
        return vn.getP2Set();

    // Compute the contexts interval
    CgEdge myEdge = getInternalEdgeFromSootEdge(e);
    if (myEdge == null)
        return vn.getP2Set();

    long low = myEdge.map_offset;
    long high = low + max_context_size_block[myEdge.s];

    // Lookup the cache
    ContextVarNode cvn = vn.context(c);
    if ( cvn != null ) {
        PointsToSetInternal ans = cvn.getP2Set();
        if ( ans != EmptyPointsToSet.v() ) return ans;
    }
    else {
        // Create a new context sensitive variable
        // The points-to vector is set to empty at start
        cvn = makeContextVarNode(vn, c);
    }

    // Fill
    PointsToSetInternal ptset = cvn.makeP2Set();
    for ( AllocNode an : pn.get_all_points_to_objects() ) {
        if ( pn.pointer_interval_points_to(low, high, an) )
            ptset.add(an);
    }

    return ptset;
}