2017-01-22 1 views
0

est ici une question liée à l'algorithme de construction du graphe d'appel pour bytecode Java en utilisant CHA.OPAL-En ce qui concerne Finding Calledges des méthodes définies dans la classe abstraite en utilisant l'algorithme CHA

Comme il n'y a pas d'implémentation de la méthode concrète des méthodes dans des classes abstraites, l'ajout d'un bord d'appel à ces méthodes pourraient être un peu trompeur. prendre par exemple junit-4.12.jar. runFailed a été défini dans junit.runner.BaseTestRunner qui est une classe abstraite. En outre, il y a des appels à runFailed dans la méthode getTest qui a également défini dans junit.runner.BaseTestRunner

Alors que dans "l'Assomption Hiérarchie pour un appel CHA Graph algorithme de construction" (Jason & Atanas), il est dit que

« donné un site d'appel xm(), où le type déclaré de x est C, le type d'exécution x12 de possible doit être un sous-type non abstrait de C. "

Pour autant que je suis considéré, sans ajouter un bord d'appel (Calledge1) junit.runner.BaseTestRunner getTest-junit.runner.BaseTestRunner runFailed, il est plus raisonnable d'ajouter un bord d'appel (Calledge2) junit.runner.BaseTestRunner getTest-junit/textui/TestRunner runFailed comme étend TestRunner BaseTestRunner.

Bien après le code de test en cours d'exécution pour obtenir le résultat de CallGraph.calledByStatistics(), a été trouvé que Calledge1. Calledge2 est manquant.

Est-ce qu'il ya quelqu'un peut me faire une faveur pour le confirmer? Merci d'avance.

Cordialement,

Jiang

Répondre

1

Je trouve OPAL offre deux vues de graphe d'appel. Le second n'ajoutera pas un "appel de bibliothèque" au bord de l'appel.

En CallGraph.calledByStatistics()

La liaison est entre callsite (PC) à appelant.Procédé par exemple: entre « invokevirtual (junit.runner.BaseTestRunner {runFailed void (java.lang.String)}) » et junit/coureur/BaseTestRunner.public junit.framework.Test getTest (java.lang.String)

Dans CallGraph.callsStatistics()

La liaison est comprise entre subtype.method à appelant.Procédé par exemple: entre en « junit/TextUI/TestRunner.protected vide runFailed (java.lang.String) » et « junit/coureur/BaseTestRunner.public junit.framework.Test getTest (java.lang.String) »