2017-02-15 14 views
0

Я пытаюсь реализовать анализ (расширяет DefaultOneStepAnalysis), чтобы построить график вызовов в алгоритмах CHA. Есть три части моего кода:«findMethods» не возвращает ожидаемые результаты

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. 

В 3), я использую метод «callBySignature», чтобы узнать cbsMethods о методе же, как и в «CHACallGraphExtractor», но он не возвращает ожидаемый результат. Хотя я использую оригинальный способ OPAL для получения cbsMethods в Extractor, результатом является набор методов.

Не могли бы вы помочь мне подтвердить, где проблема и как ее решить? спасибо.

С уважением, Цзян

---- Основная часть моего кода ----------------------------- --------------------

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

Можете вы добавить свой код в вопрос? Это поможет прояснить ваш вопрос. –

+0

Исходный код слишком сложный, когда я загружаю основную часть кода. Я также отлаживал его в OPAL, чтобы узнать, почему «cbsIndex.findMethods» не может найти методы, как ожидалось. Я нашел, что это происходит от «propertyStore (метод, CallBySignature.Key)» в CallBySignatureResolution.scala. Что касается этого утверждения, результатом моего кода является «EP (XXXX, NoCBSTargets)», а результатом исходного кода является «EP (XXX, CBSTargets (XXX))». Перейти дальше –

+0

Возможно ли, что ваш режим анализа - настольное приложение? Вы можете использовать 'project.analysisMode', чтобы проверить это –

ответ

1

Наконец, я нашел проблему из-за «AnalysisMode» После того как я переустановить AnalysisMode в «CPA« вопрос решается.

Я думаю, что я всегда должен помнить, что использовать «AnalysisMode» до того, как я разработаю алгоритм.

Благодарим Вас за беспокойство Цзян