@@ -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
0 commit comments