<div>Hi, I found spark missing call edge when call self method.The details are as follows<br></div><div>A.java<br></div><div>```<br></div><div>public class A {<br></div><div>    public void method1(){<br></div><div>        method2();<br></div><div>        new B().method2();<br></div><div>    }<br></div><div><br></div><div>    public void method2(){<br></div><div>        System.out.println("A method2");<br></div><div>    }<br></div><div>}<br></div><div>```<br></div><div>B.java<br></div><div>```<br></div><div>public class B {<br></div><div>    public void method2(){<br></div><div>        System.out.println("B method2");<br></div><div>    }<br></div><div>}<br></div><div>```<br></div><div>Main.java<br></div><div>```<br></div><div>String processDir = "/path/to/classes";<br></div><div>ArrayList<String> set_process_dir = new ArrayList<String>();<br></div><div>set_process_dir.add(processDir);<br></div><div>Options.v().set_process_dir(set_process_dir);<br></div><div>Options.v().set_whole_program(true);<br></div><div>Options.v().set_allow_phantom_refs(true);<br></div><div>Options.v().set_output_format(Options.output_format_none);<br></div><div>Scene.v().loadNecessaryClasses();<br></div><div><br></div><div>List<SootMethod> entryPoints = new ArrayList();<br></div><div>SootMethod sm = Scene.v().getSootClass("A").getMethodByName("method1");<br></div><div>entryPoints.add(sm);<br></div><div>Scene.v().setEntryPoints(entryPoints);<br></div><div>PackManager.v().runPacks();<br></div><div>Iterator<Unit> units = Scene.v().getSootClass("A").getMethodByName("method1").getActiveBody().getUnits().iterator();<br></div><div>while (units.hasNext()){<br></div><div>    Unit unit = units.next();<br></div><div>    Iterator targets = new Targets(Scene.v().getCallGraph().edgesOutOf(unit));<br></div><div>    while (targets.hasNext()){<br></div><div>        SootMethod tgt = (SootMethod) targets.next();<br></div><div>        System.out.println(unit + " may call " + tgt);<br></div><div>    }<br></div><div>}<br></div><div>```<br></div><div>when I run Main.java the output is <br></div><div>```<br></div><div>specialinvoke $r1.<B: void <init>()>() may call <B: void <init>()><br></div><div>virtualinvoke $r1.<B: void method2()>() may call <B: void method2()><br></div><div>``` <br></div><div>You can see It loses the calling side A.method1 to A.method2.<br></div><div><br></div><div>But when I comment out the option about spark,the outpout is complete<br></div><div>```<br></div><div>//        Options.v().setPhaseOption("cg.spark", "on");<br></div><div>//        Options.v().setPhaseOption("cg.spark", "enabled:true");<br></div><div>//        Options.v().setPhaseOption("cg.spark", "propagator:worklist");<br></div><div>//        Options.v().setPhaseOption("cg.spark", "on-fly-cg:true");<br></div><div><br></div><div>//output<br></div><div>virtualinvoke r0.<A: void method2()>() may call <A: void method2()><br></div><div>specialinvoke $r1.<B: void <init>()>() may call <B: void <init>()><br></div><div>virtualinvoke $r1.<B: void method2()>() may call <B: void method2()><br></div><div>```<br></div><div>So there is a way to get the complete call side,when use spark?<br></div><div><br></div><div>Thank you for taking the time.<br></div><div class="protonmail_signature_block"><div class="protonmail_signature_block-user protonmail_signature_block-empty"><br></div><div class="protonmail_signature_block-proton">Sent with <a href="https://protonmail.com" target="_blank">ProtonMail</a> Secure Email.<br></div></div><div><br></div>