2017-02-15 7 views
0

Ich versuche eine Analyse zu implementieren (erweitert DefaultOneStepAnalysis), um Aufrufgraphen in CHA-Algorithmen zu erstellen. Es gibt drei Teile meines Code:"findMethods" gibt keine erwarteten Ergebnisse zurück

1) method "doAnalyze" to return the "BasicReport" 
2) method "analyze" to find call edges for each method in the given project 
3) class "AnalysisContext" to store the context and methods using in the analysis. 

In 3), verwende ich Methode „callBySignature“ zu cbsMethods eines Verfahrens gleichen wie in „CHACallGraphExtractor“ herausfinden, aber es gibt nicht erwartetes Ergebnis. Während ich die ursprüngliche OPAL-Methode verwende, um cbsMethods in Extractor zu erhalten, ist das Ergebnis eine Reihe von Methoden.

Könnten Sie mir bitte helfen zu bestätigen, wo das Problem liegt und wie es zu lösen ist? Vielen Dank.

Grüße, Jiang

---- Hauptteil meines Codes ----------------------------- --------------------

object CHACGAnalysis extends DefaultOneStepAnalysis { 
    ... ... 
    override def doAnalyze(
            project: Project[URL], 
            parameters: Seq[String] = List.empty, 
            isInterrupted:() ⇒ Boolean 
           ): BasicReport = { 
    ... ... 
     for { 
      classFile <- project.allProjectClassFiles 
      method <- classFile.methods 
     } { 
     analyze(project, methodToCellCompleter, classFile, method)) 
     } 
    ... ... 
    } 

    def analyze(
       project: Project[URL], 
       methodToCellCompleter: Map[(String,Method), CellCompleter[K, Set[Method]]], 
       classFile: ClassFile, 
       method: Method 
       ): Unit = { 
    … … 
     val context = new AnalysisContext(project, classFile, method) 
     method.body.get.foreach((pc, instruction) ⇒ 
     instruction.opcode match { 
     ... ... 
      case INVOKEINTERFACE.opcode ⇒ 
       val INVOKEINTERFACE(declaringClass, name, descriptor) = instruction 
       context.addCallEdge_VirtualCall(pc, declaringClass, name, descriptor, true,cell1) 
      ... ... 
     } 
… … 
} 

protected[this] class AnalysisContext(
             val project: SomeProject, 
             val classFile: ClassFile, 
             val method: Method 
             ) { 
    val classHierarchy = project.classHierarchy 
    val cbsIndex = project.get(CallBySignatureResolutionKey) 
    val statistics = project.get(IntStatisticsKey) 
    val instantiableClasses = project.get(InstantiableClassesKey) 
    val cache = new CallGraphCache[MethodSignature, scala.collection.Set[Method]](project) 
private[AnalysisContext] def callBySignature(
                declaringClassType: ObjectType, 
                name:    String, 
                descriptor:   MethodDescriptor 
               ): Set[Method] = { 
     val cbsMethods = cbsIndex.findMethods(
     name, 
     descriptor, 
     declaringClassType 
    ) 
     cbsMethods 
    } 
def addCallEdge_VirtualCall(
           pc: PC, 
           declaringClassType: ObjectType, 
           name: String, 
           descriptor: MethodDescriptor, 
           isInterfaceInvocation: Boolean   = false, 
           cell1: CellCompleter[K, Set[Method]] 
           ): Unit = { 

     val cbsCalls = 
     if (isInterfaceInvocation) { 
      callBySignature(declaringClassType, name, descriptor) 
     } 
     else 
      Set.empty[Method] 

… … 
} 
… … 
} 
+0

Können Sie Ihren Code zu der Frage hinzufügen? Das würde helfen, deine Frage zu klären. –

+0

Der ursprüngliche Code ist zu kompliziert, während ich den Hauptteil des Codes hochlade. Ich habe es auch in OPAL debugged, um zu finden, warum "cbsIndex.findMethods" Methoden nicht wie erwartet finden konnte. Ich fand es kommt aus "propertyStore (Methode, CallBySignature.Key)" in CallBySignatureResolution.scala. In Bezug auf diese Aussage lautet das Ergebnis meines Codes "EP (XXXX, NoCBSTargets)" und das Ergebnis des ursprünglichen Codes ist "EP (XXX, CBSTargets (XXX))". Um weiter zu gehen –

+0

Ist es möglich, dass Ihr Analysemodus eine Desktop-Anwendung ist? Sie können 'project.analysisMode' verwenden, um es zu überprüfen –

Antwort

1

Schließlich habe ich festgestellt das Problem ist, aufgrund von "AnalysisMode" Nachdem ich das Zurücksetzen AnalysisMode in „CPA„die Frage ist gelöst

Ich denke, ich sollte immer daran denken, was "AnalysisMode" sollte verwendet werden, bevor ich den Algorithmus zu entwerfen.

Vielen Dank für Ihr Anliegen Jiang

Verwandte Themen