<html><head><meta http-equiv="content-type" content="text/html; charset=us-ascii"><style>body { line-height: 1.5; }body { font-size: 10.5pt; font-family: 'Microsoft YaHei UI'; color: rgb(0, 0, 0); line-height: 1.5; }</style></head><body>
<div><span></span>Hi all,</div><div><br></div><div>I customizd an entry point for a library (i.e. <span style="font-size: 10.5pt; line-height: 1.5; background-color: transparent;">JCommander, a command interface tool for java</span><span style="font-size: 10.5pt; line-height: 1.5; background-color: transparent;">) and used the Spark to build its CG. But The callgraph is empty. If I use the CHA, it works. </span></div><div><br></div><div>The code snippet is as follows and the <span style="color: rgb(220, 220, 170); font-family: Consolas, 'Courier New', monospace; line-height: 19px; white-space: pre; font-size: 10.5pt; background-color: rgb(30, 30, 30);">parseWithoutValidation</span><span style="font-size: 10.5pt; line-height: 1.5; background-color: transparent;"> is selected as the entry point.</span></div><div><div style="color: rgb(212, 212, 212); font-family: Consolas, 'Courier New', monospace; line-height: 19px; white-space: pre; background-color: rgb(30, 30, 30);"><div><span style="color: #569cd6;">public</span> <span style="color: #4ec9b0;">void</span> <span style="color: #dcdcaa;">parseWithoutValidation</span>(<span style="color: #4ec9b0;">String</span>... <span style="color: #9cdcfe;">args</span>) { // the customized entry point</div><div>     <span style="color: #dcdcaa;">parse</span>(<span style="color: #569cd6;">false</span> <span style="color: #6a9955;">/* no validation */</span>, args); // I think this method could be found easily by Spark~</div><div>}</div><br><div><span style="color: #569cd6;">private</span> <span style="color: #4ec9b0;">void</span> <span style="color: #dcdcaa;">parse</span>(<span style="color: #4ec9b0;">boolean</span> validate, <span style="color: #4ec9b0;">String</span>... <span style="color: #9cdcfe;">args</span>) {</div><div>    <span style="color: #4ec9b0;">StringBuilder</span> <span style="color: #9cdcfe;">sb</span> = <span style="color: #c586c0;">new</span> <span style="color: #dcdcaa;">StringBuilder</span>(<span style="color: #ce9178;">"Parsing </span><span style="color: #d7ba7d;">\"</span><span style="color: #ce9178;">"</span>);</div><div>    <span style="color: #9cdcfe;">sb</span>.<span style="color: #dcdcaa;">append</span>(<span style="color: #dcdcaa;">join</span>(args).<span style="color: #dcdcaa;">append</span>(<span style="color: #ce9178;">"</span><span style="color: #d7ba7d;">\"\n</span><span style="color: #ce9178;">  with:"</span>).<span style="color: #dcdcaa;">append</span>(<span style="color: #dcdcaa;">join</span>(<span style="color: #9cdcfe;">objects</span>.<span style="color: #dcdcaa;">toArray</span>())));</div><div>    <span style="color: #dcdcaa;">p</span>(<span style="color: #9cdcfe;">sb</span>.<span style="color: #dcdcaa;">toString</span>());</div><br><div>    <span style="color: #c586c0;">if</span> (descriptions == <span style="color: #569cd6;">null</span>) <span style="color: #dcdcaa;">createDescriptions</span>();</div><div>    <span style="color: #dcdcaa;">initializeDefaultValues</span>();</div><div>    <span style="color: #dcdcaa;">parseValues</span>(<span style="color: #dcdcaa;">expandArgs</span>(args), validate);</div><div>    <span style="color: #c586c0;">if</span> (validate) <span style="color: #dcdcaa;">validateOptions</span>();</div><div>}</div><br><div><span style="color: #569cd6;">private</span> <span style="color: #4ec9b0;">StringBuilder</span> <span style="color: #dcdcaa;">join</span>(<span style="color: #4ec9b0;">Object</span>[] args) {</div><div>    <span style="color: #4ec9b0;">StringBuilder</span> <span style="color: #9cdcfe;">result</span> = <span style="color: #c586c0;">new</span> <span style="color: #dcdcaa;">StringBuilder</span>();</div><div>    <span style="color: #c586c0;">for</span> (<span style="color: #4ec9b0;">int</span> <span style="color: #9cdcfe;">i</span> = <span style="color: #b5cea8;">0</span>; i < <span style="color: #9cdcfe;">args</span>.<span style="color: #9cdcfe;">length</span>; i++) {</div><div>        <span style="color: #c586c0;">if</span> (i > <span style="color: #b5cea8;">0</span>) <span style="color: #9cdcfe;">result</span>.<span style="color: #dcdcaa;">append</span>(<span style="color: #ce9178;">" "</span>);</div><div>        <span style="color: #9cdcfe;">result</span>.<span style="color: #dcdcaa;">append</span>(args[i]);</div><div>    }</div><div>    <span style="color: #c586c0;">return</span> result;</div><div>}</div><div>...</div></div></div><div><br></div><div>My core code is as follows.</div><div><div style="color: rgb(212, 212, 212); font-family: Consolas, 'Courier New', monospace; line-height: 19px; white-space: pre; background-color: rgb(30, 30, 30);"><div><span style="color: #569cd6;">Options.v</span>().set_process_dir(<span style="color: #569cd6;">Arrays.asList</span>(classesDir));</div><div><span style="color: #569cd6;">Options.v</span>().set_whole_program(<span style="color: #569cd6;">true</span>);</div><div><span style="color: #569cd6;">Options.v</span>().set_no_bodies_for_excluded(<span style="color: #569cd6;">true</span>);</div><div><span style="color: #569cd6;">Options.v</span>().set_allow_phantom_refs(<span style="color: #569cd6;">true</span>);</div><br><div>// set an entry point</div><div>SootClass c = <span style="color: #569cd6;">Scene.v</span>().forceResolve(entryClass, <span style="color: #569cd6;">SootClass.BODIES</span>);</div><div><span style="color: #569cd6;">c.setApplicationClass</span>();</div><div><span style="color: #569cd6;">Scene.v</span>().loadNecessaryClasses();</div><div>SootMethod method = <span style="color: #569cd6;">c.getMethodByName</span>(entryMethod);</div><div>List entryPoints = new ArrayList();</div><div><span style="color: #569cd6;">entryPoints.add</span>(method);</div><div><span style="color: #569cd6;">Scene.v</span>().setEntryPoints(entryPoints);</div><br><div>//set Spark </div><div>HashMap<String, String> opt = new HashMap<String, String>();</div><div><span style="color: #569cd6;">opt.put</span>(<span style="color: #ce9178;">"on-fly-cg"</span>, <span style="color: #ce9178;">"true"</span>);</div><div><span style="color: #569cd6;">SparkTransformer.v</span>().transform(<span style="color: #ce9178;">""</span>, opt);</div><div><span style="color: #569cd6;">PhaseOptions.v</span>().setPhaseOption(<span style="color: #ce9178;">"cg.spark"</span>, <span style="color: #ce9178;">"enabled:true"</span>);</div><br><div><span style="color: #569cd6;">PackManager.v</span>().runPacks();</div></div></div><div><br></div><div>The target java file is attached.</div><div><br></div><div>Any suggestions are welcome.</div><div><br></div><div>Best regards,</div><div>Yuan</div>
</body></html>