2017-02-15 9 views
0

CHA 알고리즘에서 콜 그래프를 작성하기 위해 (DefaultOneStepAnalysis를 확장하는) 분석을 구현하려고합니다. 3 년"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. 

) 나는 "CHACallGraphExtractor"에서와 동일한 방법의 cbsMethods을 찾는 방법 "callBySignature"을 사용하지만 예상 된 결과를 반환하지 않습니다, 내 코드의 세 부분이 있습니다. 원본 OPAL의 방법을 사용하여 추출기에서 cbsMethod를 가져 오는 동안 결과는 일련의 메서드입니다.

문제점의 위치와 해결 방법을 알려주십시오. 대단히 감사합니다.

감사합니다, 지앙

---- 내 코드의 주요 부분 ----------------------------- -------------------- 마지막으로

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"가 예상대로 메서드를 찾을 수없는 이유를 찾기 위해 디버깅했습니다. CallBySignatureResolution.scala에서 "propertyStore (method, CallBySignature.Key)"에서 온 것으로 나타났습니다. 이 진술에 관해서는, 나의 부호의 결과는 "EP (XXXX, NoCBSTargets)"이고 원래 부호의 결과는 "EP (XXX, CBSTargets (XXX))"이다. 추가 정보 –

+0

분석 모드가 데스크톱 응용 프로그램 일 수 있습니까? 'project.analysisMode'를 사용하여 검사 할 수 있습니다. –

답변

1

, 내가 찾은 문제는 내가 'CPA'로 AnalysisMode를 재설정 한 후 "AnalysisMode" 때문이다 질문이 해결되었습니다

알고리즘을 디자인하기 전에 "AnalysisMode"를 사용해야한다는 것을 항상 기억해야한다고 생각합니다.

고맙습니다. Jiang