//error
Queue<SootMethod> sootMethodQueue = new LinkedList<>();
sootMethodQueue.offer(entryPoint);
int count = 0;
//不需要使用isChanged, dummymain可以到达所有组件,这些组件包含了app的所有代码
Set<SootMethod> visited = new HashSet<>();
while (!sootMethodQueue.isEmpty()) {
SootMethod firstSootMethod = sootMethodQueue.poll();
visited.add(firstSootMethod);//---------------------------error
if (!firstSootMethod.getDeclaringClass().getName().startsWith("android.")) {//不分析android开头的
if (Util.isApplicationMethod(firstSootMethod)) {
if (firstSootMethod.hasActiveBody()) {
Body body = firstSootMethod.getActiveBody();
List<UnitPair> insertUnitList = new ArrayList<>();
for (Unit eachUnit : body.getUnits()) {
Stmt iccStmt = (Stmt) eachUnit;
SootMethod calleeSootMethod = Util.getCalleeSootMethodAt(eachUnit);
if (calleeSootMethod != null) {
if (IntentImplicitUse.iccMethods.contains(calleeSootMethod.getName())) {
InvokeExpr invokeExpr = iccStmt.getInvokeExpr();
for (Value valueIntentArg : invokeExpr.getArgs()) {
if (valueIntentArg.getType().toString().equals("android.content.Intent")) {
count++;
long beforeGetTargetComponent = System.nanoTime();
TargetComponent targetComponent = intentImplicitUse.doAnalysisIntentGetTargetComponent(valueIntentArg, iccStmt, iccStmt, firstSootMethod);
long afterGetTargetComponent = System.nanoTime();
appLogger.info("getGetTargetComponent时间:" + ((afterGetTargetComponent - beforeGetTargetComponent) / 1E9) + " seconds");
if (targetComponent != null && targetComponent.isHasInfo()) {
addTargetComponent(intentImplicitUse, insertUnitList, iccStmt, targetComponent);
}
}
}
}
}
}
Set<UnitPair> unitPairSet=new HashSet<>(insertUnitList);
if(unitPairSet.size()!=insertUnitList.size())
{
System.out.println("");
}
for (UnitPair unitPair : insertUnitList) {
body.getUnits().insertAfter(unitPair.insertUnit, unitPair.point);
body.validate();
appLogger.info(firstSootMethod + "的" + unitPair.point + "解析成功!" + unitPair.className);
}
}
}
for (Iterator<Edge> edgeIterator = cg.edgesOutOf(firstSootMethod); edgeIterator.hasNext(); ) {
Edge outEdge = edgeIterator.next();
SootMethod outSootMethod = outEdge.tgt();
if (!visited.contains(outSootMethod)) {
sootMethodQueue.offer(outSootMethod);
}
}
}
}
例如:
1(2,3,4)
2(3,4)
1
2 3 4
3 4 3 4
出现访问重复
换成算法导论上的。
Map<SootMethod,String> sootMethodColor = new HashMap<>();//存储节点颜色
Queue<SootMethod> sootMethodQueue = new LinkedList<>();
sootMethodColor.put(entryPoint,"gray");//节点颜色为null的表示还未发现,为gray表示在队列里,节点为黑色,表示所有孩子都被发现了
sootMethodQueue.offer(entryPoint);
int count = 0;
//不需要使用isChanged, dummymain可以到达所有组件,这些组件包含了app的所有代码
while (!sootMethodQueue.isEmpty()) {
SootMethod firstSootMethod = sootMethodQueue.poll();
if (!firstSootMethod.getDeclaringClass().getName().startsWith("android.")) {//不分析android开头的
if (Util.isApplicationMethod(firstSootMethod)) {
if (firstSootMethod.hasActiveBody()) {
Body body = firstSootMethod.getActiveBody();
List<UnitPair> insertUnitList = new ArrayList<>();
for (Unit eachUnit : body.getUnits()) {
Stmt iccStmt = (Stmt) eachUnit;
SootMethod calleeSootMethod = Util.getCalleeSootMethodAt(eachUnit);
if (calleeSootMethod != null) {
if (IntentImplicitUse.iccMethods.contains(calleeSootMethod.getName())) {
InvokeExpr invokeExpr = iccStmt.getInvokeExpr();
for (Value valueIntentArg : invokeExpr.getArgs()) {
if (valueIntentArg.getType().toString().equals("android.content.Intent")) {
count++;
long beforeGetTargetComponent = System.nanoTime();
TargetComponent targetComponent = intentImplicitUse.doAnalysisIntentGetTargetComponent(valueIntentArg, iccStmt, iccStmt, firstSootMethod);
long afterGetTargetComponent = System.nanoTime();
appLogger.info("getGetTargetComponent时间:" + ((afterGetTargetComponent - beforeGetTargetComponent) / 1E9) + " seconds");
if (targetComponent != null && targetComponent.isHasInfo()) {
addTargetComponent(intentImplicitUse, insertUnitList, iccStmt, targetComponent);
}
}
}
}
}
}
for (UnitPair unitPair : insertUnitList) {
body.getUnits().insertAfter(unitPair.insertUnit, unitPair.point);
body.validate();
appLogger.info(firstSootMethod + "的" + unitPair.point + "解析成功!" + unitPair.className);
}
}
}
for (Iterator<Edge> edgeIterator = cg.edgesOutOf(firstSootMethod); edgeIterator.hasNext(); ) {
Edge outEdge = edgeIterator.next();
SootMethod outSootMethod = outEdge.tgt();
if (sootMethodColor.get(outSootMethod)==null) {
sootMethodColor.put(outSootMethod,"gray");
sootMethodQueue.offer(outSootMethod);
}
}
sootMethodColor.put(firstSootMethod,"black");
}
}