title: OPAL-Regarding Finding Calledges of methods defined in Abstract Class using CHA algorithm
body: <p>Here is a question related to the algorithm of constructing the call graph for Java bytecode using CHA.</p>
  
  <p>As there is no concrete method implementation for methods in abstract classes, adding a call edge to such methods might be a bit misleading. 
  take <code>junit-4.12.jar</code> for instance. <code>runFailed</code> has been defined in <code>junit.runner.BaseTestRunner</code> which is an abstract class. Besides, there are calls to <code>runFailed</code> in method <code>getTest</code> which also defined in <code>junit.runner.BaseTestRunner</code></p>
  
  <p>While in "Assumption Hierarchy for a CHA Call Graph Construction Algorithm"(Jason&amp;Atanas), it is said that </p>
  
  <blockquote>
    <p>"given a call site x.m(), where the declared type of x is C, the
    possible runtime type of x must be a non-abstract subtype of C."</p>
  </blockquote>
  
  <p>As far as i'm considered, without add a call edge(Calledge1) from <code>junit.runner.BaseTestRunner getTest</code> to <code>junit.runner.BaseTestRunner runFailed</code>, it is more reasonable to add a call edge(Calledge2) from <code>junit.runner.BaseTestRunner getTest</code> to <code>junit/textui/TestRunner runFailed</code> as TestRunner extends BaseTestRunner.</p>
  
  <p>While after running test code to get the result of CallGraph.calledByStatistics(), only Calledge1 has been found. Calledge2 is missing.</p>
  
  <p>Is there anybody can do me a favor to confirm this?
  Thank you in advance.</p>
  
  <p>Regards,</p>
  
  <p>Jiang</p>