Я пытаюсь реализовать анализ (расширяет 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]
… …
}
… …
}
Можете вы добавить свой код в вопрос? Это поможет прояснить ваш вопрос. –
Исходный код слишком сложный, когда я загружаю основную часть кода. Я также отлаживал его в OPAL, чтобы узнать, почему «cbsIndex.findMethods» не может найти методы, как ожидалось. Я нашел, что это происходит от «propertyStore (метод, CallBySignature.Key)» в CallBySignatureResolution.scala. Что касается этого утверждения, результатом моего кода является «EP (XXXX, NoCBSTargets)», а результатом исходного кода является «EP (XXX, CBSTargets (XXX))». Перейти дальше –
Возможно ли, что ваш режим анализа - настольное приложение? Вы можете использовать 'project.analysisMode', чтобы проверить это –