protected ReferenceVariable arrayElementOfImpl(ReferenceVariable base) { VarNode l; if (base instanceof VarNode) { l = (VarNode) base; } else { FieldRefNode b = (FieldRefNode) base; l = pag.makeGlobalVarNode(b, b.getType()); pag.addEdge(b, l); } return pag.makeFieldRefNode(l, ArrayElement.v()); }
/** constructor, add edges to maps */ public MatchEdges(PAG pag) { Iterator<VarNode> store_it = pag.storeSourcesIterator(); // storeMap: store_src(VarNode) ----> store_targets(FieldRefNode) while (store_it.hasNext()) { // get the representative of the union VarNode from = ((VarNode) store_it.next()); // storeSrc, a Node[] storeTargets = pag.storeLookup(from); for (int i = 0; i < storeTargets.length; i++) { FieldRefNode storeTarget = (FieldRefNode) storeTargets[i]; // x.f VarNode storeTargetBase = storeTarget.getBase(); // x SparkField storeTargetField = storeTarget.getField(); // f String storeTargetFieldSig = ((SootField) storeTargetField).getSignature(); // f's signature // three inheritances of SparkField: // ArrayElement, Parm, and SootField if (storeTargetField instanceof SootField) { Iterator<FieldRefNode> load_it = pag.loadSourcesIterator(); while (load_it.hasNext()) { FieldRefNode loadSrc = (FieldRefNode) load_it.next(); // y.f VarNode loadSrcBase = loadSrc.getBase(); // y SparkField loadSrcField = loadSrc.getField(); // f if (loadSrcField instanceof SootField) { // see whether x.f and y.f has the same offset of // the field String loadSrcFieldSig = ((SootField) loadSrcField).getSignature(); // f's signature if (loadSrcFieldSig.equals(storeTargetFieldSig)) { Node[] to = pag.loadLookup(loadSrc); // loadTargets for (int j = 0; j < to.length; j++) { addMatchEdge(from, (VarNode) to[j]); } } } } } } } }