Skip to content

Commit 3c9930b

Browse files
committed
Merge branch 'develop' of github.com:secure-software-engineering/FlowDroid into develop
2 parents 9e117e2 + 65eda0b commit 3c9930b

2 files changed

Lines changed: 28 additions & 12 deletions

File tree

soot-infoflow-summaries/src/soot/jimple/infoflow/methodSummary/generator/SummaryGenerator.java

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -342,18 +342,30 @@ public ClassSummaries createMethodSummaries(String classpath, Collection<String>
342342
}
343343
}
344344

345-
// We also need to analyze methods of parent classes except for
346-
// those methods that have been overwritten in the child class
347-
SootClass curClass = sc.getSuperclassUnsafe();
348-
while (curClass != null) {
349-
if (!curClass.isConcrete() || curClass.isLibraryClass())
350-
break;
345+
// We also need to analyze methods of (transitive) parent classes except for
346+
// those methods that have been overwritten in the child class. From Java 8,
347+
// interfaces can implement default methods. Therefore, methods of implemented
348+
// interfaces need to be analyzed as well.
349+
List<SootClass> parentClasses = new ArrayList<>();
350+
if (sc.hasSuperclass())
351+
parentClasses.add(sc.getSuperclassUnsafe());
352+
parentClasses.addAll(sc.getInterfaces());
353+
Set<SootClass> doneClasses = new HashSet<>();
354+
while (!parentClasses.isEmpty()) {
355+
SootClass curClass = parentClasses.remove(0);
356+
if (curClass == null || curClass.getName().equals("java.lang.Object") || doneClasses.contains(curClass))
357+
continue;
351358

352359
for (SootMethod sm : curClass.getMethods()) {
353-
if (checkAndAdd(analysisTask, sm))
360+
if (!doneMethods.contains(sm.getSubSignature()) && checkAndAdd(analysisTask, sm))
354361
doneMethods.add(sm.getSubSignature());
355362
}
356-
curClass = curClass.getSuperclassUnsafe();
363+
364+
doneClasses.add(curClass);
365+
366+
if (curClass.hasSuperclass())
367+
parentClasses.add(curClass.getSuperclassUnsafe());
368+
parentClasses.addAll(curClass.getInterfaces());
357369
}
358370
}
359371

@@ -365,7 +377,7 @@ public ClassSummaries createMethodSummaries(String classpath, Collection<String>
365377

366378
// Do the actual analysis
367379
ClassSummaries summaries = new ClassSummaries();
368-
for (ClassAnalysisTask analysisTask : realClasses) {
380+
for (ClassAnalysisTask analysisTask : sortedTasks) {
369381
final String className = analysisTask.className;
370382

371383
// Check if we really need to analyze this class
@@ -442,13 +454,13 @@ private boolean checkAndAdd(ClassAnalysisTask analysisTask, SootMethod sm) {
442454
return false;
443455

444456
// We normally don't analyze hashCode() and equals()
445-
final String sig = sm.getSignature();
457+
final String subSig = sm.getSubSignature();
446458
if (!config.getSummarizeHashCodeEquals()) {
447-
if (sig.equals("int hashCode()") || sig.equals("boolean equals(java.lang.Object)"))
459+
if (subSig.equals("int hashCode()") || subSig.equals("boolean equals(java.lang.Object)"))
448460
return false;
449461
}
450462

451-
analysisTask.addMethod(sig);
463+
analysisTask.addMethod(sm.getSignature());
452464
return true;
453465
}
454466

soot-infoflow/src/soot/jimple/infoflow/entryPointCreators/BaseEntryPointCreator.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,8 @@ protected Stmt buildMethodCall(SootMethod methodToCall, Local classLocal, Set<So
311311
assert classLocal != null : "Class local method was null for non-static method call";
312312
if (methodToCall.isConstructor())
313313
invokeExpr = Jimple.v().newSpecialInvokeExpr(classLocal, methodToCall.makeRef(), args);
314+
else if (methodToCall.getDeclaringClass().isInterface())
315+
invokeExpr = Jimple.v().newInterfaceInvokeExpr(classLocal, methodToCall.makeRef(), args);
314316
else
315317
invokeExpr = Jimple.v().newVirtualInvokeExpr(classLocal, methodToCall.makeRef(), args);
316318
}
@@ -321,6 +323,8 @@ protected Stmt buildMethodCall(SootMethod methodToCall, Local classLocal, Set<So
321323
assert classLocal != null : "Class local method was null for non-static method call";
322324
if (methodToCall.isConstructor())
323325
invokeExpr = Jimple.v().newSpecialInvokeExpr(classLocal, methodToCall.makeRef());
326+
else if (methodToCall.getDeclaringClass().isInterface())
327+
invokeExpr = Jimple.v().newInterfaceInvokeExpr(classLocal, methodToCall.makeRef(), args);
324328
else
325329
invokeExpr = Jimple.v().newVirtualInvokeExpr(classLocal, methodToCall.makeRef());
326330
}

0 commit comments

Comments
 (0)