use of soot.jimple.spark.pag.Node in project soot by Sable.
the class SootUtil method buildStoreMap.
public static FieldAccessMap buildStoreMap(PAG pag) {
FieldAccessMap ret = new FieldAccessMap();
Iterator frNodeIter = pag.storeInvSourcesIterator();
while (frNodeIter.hasNext()) {
FieldRefNode frNode = (FieldRefNode) frNodeIter.next();
SparkField field = frNode.getField();
Node[] targets = pag.storeInvLookup(frNode);
for (int i = 0; i < targets.length; i++) {
VarNode target = (VarNode) targets[i];
if (target instanceof GlobalVarNode)
continue;
ret.put(field, new Pair<FieldRefNode, LocalVarNode>(frNode, (LocalVarNode) target));
}
}
return ret;
}
use of soot.jimple.spark.pag.Node in project soot by Sable.
the class SootUtil method loadsOnField.
public static FieldToEdgesMap loadsOnField(PAG pag) {
FieldToEdgesMap loadsOnField = new FieldToEdgesMap();
Iterator frNodeIter = pag.loadSourcesIterator();
while (frNodeIter.hasNext()) {
FieldRefNode frNode = (FieldRefNode) frNodeIter.next();
VarNode source = frNode.getBase();
SparkField field = frNode.getField();
Node[] targets = pag.loadLookup(frNode);
for (int i = 0; i < targets.length; i++) {
VarNode target = (VarNode) targets[i];
loadsOnField.put(field, new Pair<VarNode, VarNode>(target, source));
}
}
return loadsOnField;
}
use of soot.jimple.spark.pag.Node in project soot by Sable.
the class CallGraphBuilder method build.
public void build() {
QueueReader<MethodOrMethodContext> worklist = reachables.listener();
while (true) {
ofcgb.processReachables();
reachables.update();
if (!worklist.hasNext())
break;
final MethodOrMethodContext momc = worklist.next();
List<Local> receivers = ofcgb.methodToReceivers().get(momc.method());
if (receivers != null)
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();
ofcgb.addType(receiver, momc.context(), type, null);
}
}
List<Local> bases = ofcgb.methodToInvokeArgs().get(momc.method());
if (bases != null) {
for (Local base : bases) {
PointsToSet pts = pa.reachingObjects(base);
for (Type ty : pts.possibleTypes()) {
ofcgb.addBaseType(base, momc.context(), ty);
}
}
}
List<Local> argArrays = ofcgb.methodToInvokeBases().get(momc.method());
if (argArrays != null) {
for (final Local argArray : argArrays) {
PointsToSet pts = pa.reachingObjects(argArray);
if (pts instanceof PointsToSetInternal) {
PointsToSetInternal ptsi = (PointsToSetInternal) pts;
ptsi.forall(new P2SetVisitor() {
@Override
public void visit(Node n) {
assert n instanceof AllocNode;
AllocNode an = (AllocNode) n;
Object newExpr = an.getNewExpr();
ofcgb.addInvokeArgDotField(argArray, an.dot(ArrayElement.v()));
if (newExpr instanceof NewArrayExpr) {
NewArrayExpr nae = (NewArrayExpr) newExpr;
Value size = nae.getSize();
if (size instanceof IntConstant) {
IntConstant arrSize = (IntConstant) size;
ofcgb.addPossibleArgArraySize(argArray, arrSize.value, momc.context());
} else {
ofcgb.setArgArrayNonDetSize(argArray, momc.context());
}
}
}
});
}
for (Type t : pa.reachingObjectsOfArrayElement(pts).possibleTypes()) {
ofcgb.addInvokeArgType(argArray, momc.context(), t);
}
}
}
List<Local> stringConstants = ofcgb.methodToStringConstants().get(momc.method());
if (stringConstants != null)
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) {
ofcgb.addStringConstant(stringConstant, momc.context(), null);
} else {
for (Iterator<String> constantIt = possibleStringConstants.iterator(); constantIt.hasNext(); ) {
final String constant = constantIt.next();
ofcgb.addStringConstant(stringConstant, momc.context(), constant);
}
}
}
}
}
use of soot.jimple.spark.pag.Node in project soot by Sable.
the class StartJoinAnalysis method getMayAliasList.
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;
}
use of soot.jimple.spark.pag.Node in project soot by Sable.
the class MergeChecker method handleSimples.
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);
}
}
Aggregations