<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 style="font-size: 12px;"><span></span>Dear all,</span></div><div><br></div><div><span style="color: rgb(34, 34, 34); font-family: Arial, Helvetica, sans-serif; font-size: 13px; font-variant-ligatures: normal; orphans: 2; widows: 2;">I want to build a CG for a program. I refer to this </span><font color="#6611cc" face="Arial, Helvetica, sans-serif"><span style="border-style: initial; border-color: initial; cursor: pointer; font-size: 13px; orphans: 2; widows: 2;"><a href="https://o2lab.github.io/710/p/TestSootCallGraph.java">post</a></span></font><span style="color: rgb(34, 34, 34); font-family: Arial, Helvetica, sans-serif; font-size: 13px; font-variant-ligatures: normal; orphans: 2; widows: 2;"> and modified some code. It works for me. The main code is as follows.</span></div>
<div><br></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: #569cd6;">static</span> <span style="color: #4ec9b0;">void</span> <span style="color: #dcdcaa;">main</span>(<span style="color: #4ec9b0;">String</span>[] args) {</div><div>    <span style="color: #6a9955;">//ses -- APISeqtest success</span></div><div>    <span style="color: #4ec9b0;">String</span> <span style="color: #9cdcfe;">classesDir</span> = <span style="color: #ce9178;">"D:</span><span style="color: #d7ba7d;">\\</span><span style="color: #ce9178;">wkspace</span><span style="color: #d7ba7d;">\\</span><span style="color: #ce9178;">seed8</span><span style="color: #d7ba7d;">\\</span><span style="color: #ce9178;">dir</span><span style="color: #d7ba7d;">\\</span><span style="color: #ce9178;">APISeqtest"</span>;</div><div>    <span style="color: #4ec9b0;">String</span> <span style="color: #9cdcfe;">mainClass</span> = <span style="color: #ce9178;">"com.ouc.Demo"</span>;</div><br><div>    <span style="color: #6a9955;">//set classpath</span></div><div>    <span style="color: #4ec9b0;">String</span> <span style="color: #9cdcfe;">jreDir</span> = <span style="color: #9cdcfe;">System</span>.<span style="color: #dcdcaa;">getProperty</span>(<span style="color: #ce9178;">"java.home"</span>) + <span style="color: #ce9178;">"</span><span style="color: #d7ba7d;">\\</span><span style="color: #ce9178;">lib</span><span style="color: #d7ba7d;">\\</span><span style="color: #ce9178;">jce.jar"</span>;</div><div>    <span style="color: #4ec9b0;">String</span> <span style="color: #9cdcfe;">jceDir</span> = <span style="color: #9cdcfe;">System</span>.<span style="color: #dcdcaa;">getProperty</span>(<span style="color: #ce9178;">"java.home"</span>) + <span style="color: #ce9178;">"</span><span style="color: #d7ba7d;">\\</span><span style="color: #ce9178;">lib</span><span style="color: #d7ba7d;">\\</span><span style="color: #ce9178;">rt.jar"</span>;</div><div>    <span style="color: #4ec9b0;">String</span> <span style="color: #9cdcfe;">path</span> = jreDir + <span style="color: #9cdcfe;">File</span>.<span style="color: #9cdcfe;">pathSeparator</span> + jceDir + <span style="color: #9cdcfe;">File</span>.<span style="color: #9cdcfe;">pathSeparator</span> + classesDir;</div><div>    <span style="color: #9cdcfe;">Scene</span>.<span style="color: #dcdcaa;">v</span>().<span style="color: #dcdcaa;">setSootClassPath</span>(path);</div><br><div>    <span style="color: #6a9955;">//add an intra-procedural analysis phase to Soot</span></div><div>    <span style="color: #4ec9b0;">TestCallGraphSootJaronlyoneclass</span> <span style="color: #9cdcfe;">analysis</span> = <span style="color: #c586c0;">new</span> <span style="color: #dcdcaa;">TestCallGraphSootJaronlyoneclass</span>();</div><div>    <span style="color: #9cdcfe;">PackManager</span>.<span style="color: #dcdcaa;">v</span>().<span style="color: #dcdcaa;">getPack</span>(<span style="color: #ce9178;">"wjtp"</span>).<span style="color: #dcdcaa;">add</span>(<span style="color: #c586c0;">new</span> <span style="color: #dcdcaa;">Transform</span>(<span style="color: #ce9178;">"wjtp.TestSootCallGraph"</span>, analysis));</div><br><div>    <span style="color: #dcdcaa;">excludeJDKLibrary</span>();</div><br><div>    <span style="color: #9cdcfe;">Options</span>.<span style="color: #dcdcaa;">v</span>().<span style="color: #dcdcaa;">set_process_dir</span>(<span style="color: #9cdcfe;">Arrays</span>.<span style="color: #dcdcaa;">asList</span>(classesDir));</div><div>    <span style="color: #9cdcfe;">Options</span>.<span style="color: #dcdcaa;">v</span>().<span style="color: #dcdcaa;">set_whole_program</span>(<span style="color: #569cd6;">true</span>);</div><div>    <span style="color: #6a9955;">//Options.v().set_app(true);</span></div><br><div>    <span style="color: #9cdcfe;">Scene</span>.<span style="color: #dcdcaa;">v</span>().<span style="color: #dcdcaa;">loadNecessaryClasses</span>();</div><div>    <span style="color: #4ec9b0;">SootClass</span> <span style="color: #9cdcfe;">sc</span> = <span style="color: #9cdcfe;">Scene</span>.<span style="color: #dcdcaa;">v</span>().<span style="color: #dcdcaa;">getSootClass</span>(mainClass);</div><div>    <span style="color: #9cdcfe;">Scene</span>.<span style="color: #dcdcaa;">v</span>().<span style="color: #dcdcaa;">setMainClass</span>(sc);</div><br><div>    <span style="color: #6a9955;">//enableCHACallGraph();</span></div><div>    <span style="color: #dcdcaa;">enableSparkCallGraph</span>();</div><br><div>    <span style="color: #9cdcfe;">PackManager</span>.<span style="color: #dcdcaa;">v</span>().<span style="color: #dcdcaa;">runPacks</span>();</div><div>}</div></div><div><br></div><div><div style="margin: 0px; padding: 0px; border: 0px; color: rgb(34, 34, 34); font-family: Arial, Helvetica, sans-serif; font-size: 13px; font-variant-ligatures: normal; orphans: 2; widows: 2;"><b>But if a program contains one more main methods, for example, C1, C2 and C3 all contain a main method, should I choose which one (<span style="margin: 0px; padding: 0px; border: 0px; background-color: rgb(250, 250, 250); color: rgb(102, 102, 0); font-family: monospace;">Scene.v().setMainClass(C1 or C2 or C3)</span>)?</b></div><div style="margin: 0px; padding: 0px; border: 0px; color: rgb(34, 34, 34); font-family: Arial, Helvetica, sans-serif; font-size: 13px; font-variant-ligatures: normal; orphans: 2; widows: 2;"><br></div><div style="margin: 0px; padding: 0px; border: 0px; color: rgb(34, 34, 34); font-family: Arial, Helvetica, sans-serif; font-size: 13px; font-variant-ligatures: normal; orphans: 2; widows: 2;">This case does exist. Assume that  C1 is the true mainClass, then main method in C1 could call main methods of C2 and C3. Or main method in C3 is just used to test C3.</div><div style="margin: 0px; padding: 0px; border: 0px; color: rgb(34, 34, 34); font-family: Arial, Helvetica, sans-serif; font-size: 13px; font-variant-ligatures: normal; orphans: 2; widows: 2;"><br></div><div style="margin: 0px; padding: 0px; border: 0px; color: rgb(34, 34, 34); font-family: Arial, Helvetica, sans-serif; font-size: 13px; font-variant-ligatures: normal; orphans: 2; widows: 2;">As described above, it's a little difficult to specify the true main method and the true mainClass. </div><div style="margin: 0px; padding: 0px; border: 0px; color: rgb(34, 34, 34); font-family: Arial, Helvetica, sans-serif; font-size: 13px; font-variant-ligatures: normal; orphans: 2; widows: 2;"><br></div><div style="margin: 0px; padding: 0px; border: 0px; color: rgb(34, 34, 34); font-family: Arial, Helvetica, sans-serif; font-size: 13px; font-variant-ligatures: normal; orphans: 2; widows: 2;">Although I find that if I don't specify a mainClass when building CG, the program also works. But this post tell me that it's not <font color="#6611cc"><span style="border-style: initial; border-color: initial; cursor: pointer;"><a href="https://groups.google.com/forum/#!topic/soot-list/jcHrdhzJyl0">precise</a></span></font>.</div></div><div style="margin: 0px; padding: 0px; border: 0px; color: rgb(34, 34, 34); font-family: Arial, Helvetica, sans-serif; font-size: 13px; font-variant-ligatures: normal; orphans: 2; widows: 2;"><br></div><div style="margin: 0px; padding: 0px; border: 0px; color: rgb(34, 34, 34); font-family: Arial, Helvetica, sans-serif; font-size: 13px; font-variant-ligatures: normal; orphans: 2; widows: 2;">Besides, I want to extract the identifiers from method body, is there already APIs support that in soot?</div><div style="margin: 0px; padding: 0px; border: 0px; color: rgb(34, 34, 34); font-family: Arial, Helvetica, sans-serif; font-size: 13px; font-variant-ligatures: normal; orphans: 2; widows: 2;"><br></div><div style="margin: 0px; padding: 0px; border: 0px; color: rgb(34, 34, 34); font-family: Arial, Helvetica, sans-serif; font-size: 13px; font-variant-ligatures: normal; orphans: 2; widows: 2;"><span style="color: rgb(34, 34, 34); background-color: rgba(0, 0, 0, 0);">Any help would be greatly appreciated!</span></div><div style="margin: 0px; padding: 0px; border: 0px; color: rgb(34, 34, 34); font-family: Arial, Helvetica, sans-serif; font-size: 13px; font-variant-ligatures: normal; orphans: 2; widows: 2;"><br></div><div style="margin: 0px; padding: 0px; border: 0px; color: rgb(34, 34, 34); font-family: Arial, Helvetica, sans-serif; font-size: 13px; font-variant-ligatures: normal; orphans: 2; widows: 2;">Best regards,</div><div style="margin: 0px; padding: 0px; border: 0px; color: rgb(34, 34, 34); font-family: Arial, Helvetica, sans-serif; font-size: 13px; font-variant-ligatures: normal; orphans: 2; widows: 2;">Yuan Liu</div></body></html>