<div dir="ltr">Hi Steven,<div><br></div><div>Could you please tell me how/where to change Infoflow.java or a related file so that full, non-stub, library jars, i.e. android.jar, rt.jar, and jce.jar, are picked up? </div><div><br></div><div>Thanks</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Feb 10, 2015 at 9:14 PM, Steven Arzt <span dir="ltr">&lt;<a href="mailto:Steven.Arzt@cased.de" target="_blank">Steven.Arzt@cased.de</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div lang="DE" link="blue" vlink="purple"><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">Hi Peter,<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">What a suitable filler for the gap should look like depends on your analysis problem. If you are ok with treating the library methods as black boxes, but want the incoming and outgoing call edges (i.e., those edges that cross the boundary of the library’s interface), there has been some work in the area. I am not aware of any readily available implementation on top of Soot, but for WALA there is Averroes:<u></u><u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">                <a href="http://link.springer.com/chapter/10.1007/978-3-642-39038-8_16" target="_blank">http://link.springer.com/chapter/10.1007/978-3-642-39038-8_16</a><u></u><u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">The basic idea behind Averroes is to take a full implementation of a library and throw away everything that is not required for callgraph construction. This gives you a very lightweight stub that you can use when analyzing client programs while still maintaining a full callgraph.<u></u><u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">Best regards,<u></u><u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">  Steven<u></u><u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;">Von:</span></b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;"> <a href="mailto:soot-list-bounces@CS.McGill.CA" target="_blank">soot-list-bounces@CS.McGill.CA</a> [mailto:<a href="mailto:soot-list-bounces@CS.McGill.CA" target="_blank">soot-list-bounces@CS.McGill.CA</a>] <b>Im Auftrag von </b>Peter Kim<br><b>Gesendet:</b> Dienstag, 10. Februar 2015 21:13</span></p><div><div class="h5"><br><b>An:</b> Steven Arzt<br><b>Cc:</b> <a href="mailto:soot-list@cs.mcgill.ca" target="_blank">soot-list@cs.mcgill.ca</a><br><b>Betreff:</b> Re: [Soot-list] Missing call graph edges<u></u><u></u></div></div><p></p><div><div class="h5"><p class="MsoNormal"><u></u> <u></u></p><div><p class="MsoNormal">Hi Steven,<u></u><u></u></p><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">Thanks for your clarification. What I was really trying to ask was if there is an easy way to manually fill in the gaps, missing due to library stubs, for call graph construction using Spark for Android apps. Basically, a model of the Android framework like taint wrappers, but for precise Android call graph construction. <u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div></div><div><p class="MsoNormal"><u></u> <u></u></p><div><p class="MsoNormal">On Tue, Feb 10, 2015 at 7:45 PM, Steven Arzt &lt;<a href="mailto:Steven.Arzt@cased.de" target="_blank">Steven.Arzt@cased.de</a>&gt; wrote:<u></u><u></u></p><div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">Hi Peter,</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">There still seems to be some misunderstanding about the concept of taint wrappers. You write that you do not want to perform taint tracking. In that case, the taint wrappers provided by FlowDroid will not be of much help, so it doesn’t even matter what you put into EasyTaintWrapperSource.txt. Again: Taint wrappers have nothing to do with callgraph construction. They are a means for the taint analysis to get along with an incomplete callgraph and “fill the gaps” with respect to the semantics of taint tracking.</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">The conceptual problem I described in my last e-mail has nothing to do with how you obtain the callgraph in Soot either. Your callgraph will be incomplete. That’s what happens because of how the SPARK callgraph algorithm works.</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">The methods I explained in my last e-mail are ways to deal with the problem. You can either analyze your apps together with full OS / library implementations (with all the downsides this has), or you can extend your client analysis to work with an incomplete callgraph which is what I recommend. Besides that, if you are willing to greatly sacrifice callgraph precision, you might also give CHA a try. CHA does not depend on allocation sites, so the CHA callgraph will at least be somewhat sound (given the usual small print). For most analyses, CHA is however not an option due to its really heavy over-approximation.</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">If you chose to include the library code in your analysis, this has nothing to do with where you get your apps from. With “library”, I mean the Android platform implementation, the stuff that is installed on your phone ever since. By the way, “just an APK” is never sufficient. You always need some kind of library model; usually, you just use a very minimalistic one provided through the stub JAR files from the Android SDK.</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">Best regards,</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">  Steven</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;">Von:</span></b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;"> <a href="mailto:soot-list-bounces@CS.McGill.CA" target="_blank">soot-list-bounces@CS.McGill.CA</a> [mailto:<a href="mailto:soot-list-bounces@CS.McGill.CA" target="_blank">soot-list-bounces@CS.McGill.CA</a>] <b>Im Auftrag von </b>Peter Kim<br><b>Gesendet:</b> Dienstag, 10. Februar 2015 19:13</span><u></u><u></u></p><div><div><p class="MsoNormal"><br><b>An:</b> Steven Arzt<br><b>Cc:</b> <a href="mailto:soot-list@cs.mcgill.ca" target="_blank">soot-list@cs.mcgill.ca</a><br><b>Betreff:</b> Re: [Soot-list] Missing call graph edges<u></u><u></u></p></div></div><div><div><p class="MsoNormal"> <u></u><u></u></p><div><p class="MsoNormal">Hi Steven,<u></u><u></u></p><div><p class="MsoNormal"> <u></u><u></u></p></div><div><p class="MsoNormal">Thanks for your response. I have some follow up questions:<u></u><u></u></p></div><div><p class="MsoNormal"> <u></u><u></u></p></div><div><p class="MsoNormal">- I changed &quot;EasyTaintWrapperSource.txt&quot; to include &quot;&lt;java.util.ArrayList: java.lang.Object get(int)&gt;&quot; but it&#39;s still not working. Is this the right way to add a taint wrapper?<u></u><u></u></p></div><div><p class="MsoNormal"> <u></u><u></u></p></div><div><p class="MsoNormal">- I am not interested in taint analysis. I only want a call graph for an Android app. Is what I am doing, i.e. extending Infoflow and getting call graph through Scene, the best way to get the call graph or is there a better way? Note that I&#39;m getting the call graph *before* FlowDroid starts looking at sources/sinks.<u></u><u></u></p></div><div><p class="MsoNormal"> <u></u><u></u></p></div><div><p class="MsoNormal">- Suppose that I&#39;m analyzing APKs found on the web. Will these ever come with full library implementations or will they have just stubs? So if I wanted to transform/analyze library code, it seems that it would not be possible to do so with just an APK.<u></u><u></u></p></div><div><p class="MsoNormal"> <u></u><u></u></p></div></div><div><p class="MsoNormal"> <u></u><u></u></p><div><p class="MsoNormal">On Tue, Feb 10, 2015 at 9:56 AM, Steven Arzt &lt;<a href="mailto:Steven.Arzt@cased.de" target="_blank">Steven.Arzt@cased.de</a>&gt; wrote:<u></u><u></u></p><div><div><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">Hi Peter,</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">The callgraph edges have nothing to do with basic blocks. The difference here is that “remove” is called on the base object “objects” and “free” is called on “obj”. What you observe is that you have outgoing call edges for all calls on “objects”, but none for calls on “obj”. This usually means that the SPARK callgraph algorithm is unable to propagate allocation sites to the base object “obj”. Therefore, it cannot decide where the calls should go.</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">The question now is why the allocation site propagation fails for “obj”. I guess you are running FlowDroid with the Android JAR files from the official SDK? These JAR files are only stubs, so there is no real implementation of “java.util.ArrayList”. All methods inside this class (and all other system classes) will only throw NotImplementedExceptions. Therefore, SPARK cannot know what the return type of “get()” would be – it could be everything. In such a case, SPARK does not perform an over-approximation using CHA, but simply leaves out the respective edges.</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">How to get around the problem? Firstly, you could use a full implementation of the Android system classes and analyze them along with your program. The disadvantage of this approach is that you are analyzing tens of megabytes of system code together with an app of a few kilobytes. Your memory consumption will likely blow up to tens of gigabytes due to all the allocation site propagation inside the system libraries and you will have to wait a long time for your callgraph.</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">Another idea would be to just live with the incomplete callgraph. That’s what FlowDroid does. We know that we don’t have call edges for some call sites. If we encounter such a situation during the taint propagation, we query a store of explicit models for library methods on how to continue with the taint propagation. You might want to read up on Taint Wrappers in the FlowDroid paper. This approach is fast and scalable, with the downside of having to provide these models by hand. In FlowDroid, we currently have a rule set that works pretty well for most of the Android API.</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">This explanation is by the way also consistent with your observation what you get a call edge if you change “free” to a static method: In that case, you get a StaticInvokeExpr instead of a VirtualInvokeExpr and call resolution becomes much more trivial.</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">Best regards,</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">  Steven</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:13.5pt;font-family:&quot;Courier New&quot;;color:black">M.Sc. M.Sc. Steven Arzt</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:&quot;Courier New&quot;;color:black">Secure Software Engineering Group (SSE)</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:&quot;Courier New&quot;;color:black">European Center for Security and Privacy by Design (EC SPRIDE) </span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:10.0pt;font-family:&quot;Courier New&quot;;color:black">Rheinstraße 75</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:10.0pt;font-family:&quot;Courier New&quot;;color:black">D-64293 Darmstadt</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:10.0pt;font-family:&quot;Courier New&quot;;color:black">Phone: +49 61 51 869-336</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:10.0pt;font-family:&quot;Courier New&quot;;color:black">Fax: <a href="tel:%2B49%2061%2051%2016-72118" target="_blank">+49 61 51 16-72118</a></span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:&quot;Courier New&quot;;color:black">eMail: </span><span style="font-size:10.0pt;font-family:&quot;Courier New&quot;;color:black"><a href="mailto:steven.arzt@ec-spride.de" target="_blank"><span lang="EN-US">steven.arzt@ec-spride.de</span></a></span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:10.0pt;font-family:&quot;Courier New&quot;;color:black">Web: <a href="http://sse.ec-spride.de/" target="_blank">http://sse.ec-spride.de</a></span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal"><b><span lang="EN-US" style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;">Von:</span></b><span lang="EN-US" style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;"> Peter Kim [mailto:<a href="mailto:chpkim@gmail.com" target="_blank">chpkim@gmail.com</a>] <br><b>Gesendet:</b> Montag, 9. Febru</span><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;">ar 2015 22:38<br><b>An:</b> Sam Blackshear<br><b>Cc:</b> Steven Arzt; <a href="mailto:soot-list@cs.mcgill.ca" target="_blank">soot-list@cs.mcgill.ca</a></span><u></u><u></u></p><div><div><p class="MsoNormal"><br><b>Betreff:</b> Re: [Soot-list] Missing call graph edges<u></u><u></u></p></div></div><div><div><p class="MsoNormal"> <u></u><u></u></p><div><p class="MsoNormal">Hi Sam,<u></u><u></u></p><div><p class="MsoNormal"> <u></u><u></u></p></div><div><p class="MsoNormal">Yes, I changed the code, re-ran Soot, and Soot still doesn&#39;t report the edges. <u></u><u></u></p></div><div><p class="MsoNormal"> <u></u><u></u></p></div><div><p class="MsoNormal"> <u></u><u></u></p></div><div><p class="MsoNormal">Hi Steve,<u></u><u></u></p></div><div><p class="MsoNormal"> <u></u><u></u></p></div><div><p class="MsoNormal">Note that when I change &quot;free()&quot; to a static method, the edge is reported, but when it is an instance method, it is not reported. In light of the discussion with Sam, I want to make it absolutely clear that the code runs fine even when it is an instance method, so in my view, it seems to be a bug or perhaps Infoflow is constructing a call graph that is different from the traditional call graph, but since you told me that you changed it back to return a traditional call graph, I think it deserves an investigation.<u></u><u></u></p></div><div><p class="MsoNormal"> <u></u><u></u></p></div><div><p class="MsoNormal">Thanks.<u></u><u></u></p></div></div><div><p class="MsoNormal"> <u></u><u></u></p><div><p class="MsoNormal">On Mon, Feb 9, 2015 at 9:31 PM, Sam Blackshear &lt;<a href="mailto:samuel.blackshear@colorado.edu" target="_blank">samuel.blackshear@colorado.edu</a>&gt; wrote:<u></u><u></u></p><div><p class="MsoNormal">Call graph construction is typically flow-insensitive, so it is not precise enough to do the kind of reasoning you are doing in your head (i.e. For <span style="font-size:10.0pt">&quot;objects.remove()&quot; to be included in the call graph, &quot;obj&quot; cannot be null). If you are not familiar with the flow-insensitive call graph construction algorithms used by tools like Soot, <a href="http://manu.sridharan.net/files/aliasAnalysisChapter.pdf" target="_blank">this</a> is a good place to start.</span><u></u><u></u></p><div><p class="MsoNormal"> <u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:10.0pt">Now, if you changed the code in that way that you described (adding one or more objects to the objects list), re-ran Soot, and Soot still does not report the edges, that is a problem for Soot (and thus goes beyond my expertise :)). But for the example program you posted, Soot&#39;s result is as expected for a flow-insensitive call graph construction algorithm.</span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="color:#888888"> </span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:10.0pt;color:#888888">- Sam</span><u></u><u></u></p></div></div><div><div><div><p class="MsoNormal"> <u></u><u></u></p><div><p class="MsoNormal">On Mon, Feb 9, 2015 at 2:22 PM, Peter Kim &lt;<a href="mailto:chpkim@gmail.com" target="_blank">chpkim@gmail.com</a>&gt; wrote:<u></u><u></u></p><div><p class="MsoNormal">Hi Sam,<u></u><u></u></p><div><p class="MsoNormal"> <u></u><u></u></p></div><div><p class="MsoNormal">The code snippet is the following:<u></u><u></u></p></div><div><p class="MsoNormal"> <u></u><u></u></p></div><div><div><p class="MsoNormal">BaseTweet&lt;?&gt; obj = objects.get(i);<u></u><u></u></p></div><div><p class="MsoNormal">if (obj.isFinished() &amp;&amp; obj.isAutoRemoveEnabled) {<u></u><u></u></p></div><div><p class="MsoNormal">  objects.remove(i);<u></u><u></u></p></div><div><p class="MsoNormal">  obj.free();<u></u><u></u></p></div><div><p class="MsoNormal">}<u></u><u></u></p></div></div><div><p class="MsoNormal"> <u></u><u></u></p></div><div><p class="MsoNormal">For &quot;objects.remove()&quot; to be included in the call graph, &quot;obj&quot; cannot be null. So even without any object in the list, if &quot;objects.remove()&quot; is included, then &quot;obj.free()&quot; should be included as well.<u></u><u></u></p></div><div><p class="MsoNormal"> <u></u><u></u></p></div><div><p class="MsoNormal">Just to be absolutely sure though, I just ran the app with one object in the list and made sure that the true branch is executed. Soot still returns only &quot;remove()&quot; in the call graph. I also made sure that &quot;free()&quot; prints output (meaning it shouldn&#39;t be excluded from the call graph).<u></u><u></u></p></div><div><p class="MsoNormal"> <u></u><u></u></p></div></div><div><div><div><p class="MsoNormal"> <u></u><u></u></p><div><p class="MsoNormal">On Mon, Feb 9, 2015 at 9:08 PM, Sam Blackshear &lt;<a href="mailto:samuel.blackshear@colorado.edu" target="_blank">samuel.blackshear@colorado.edu</a>&gt; wrote:<u></u><u></u></p><div><p class="MsoNormal">Peter,<u></u><u></u></p><div><p class="MsoNormal">  What you observe is consistent with what I explained. The objects.remove() method is included because objects is initialized to a non-null ArrayList. However, obj.free() is not included because the analysis is smart enough to determine that there is no possible concrete execution in which the method obj.free() will be called (the statement obj.free() will throw an exception *if* it ever executes, because obj will always be null).<u></u><u></u></p></div><div><p class="MsoNormal"><span style="color:#888888"> </span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="color:#888888">- Sam</span><u></u><u></u></p></div></div><div><div><div><p class="MsoNormal"> <u></u><u></u></p><div><p class="MsoNormal">On Mon, Feb 9, 2015 at 1:54 PM, Peter Kim &lt;<a href="mailto:chpkim@gmail.com" target="_blank">chpkim@gmail.com</a>&gt; wrote:<u></u><u></u></p><div><p class="MsoNormal">Hi Sam,<u></u><u></u></p><div><p class="MsoNormal"> <u></u><u></u></p></div><div><p class="MsoNormal">The loop iteration is executed only if there is an item in the list, so it shouldn&#39;t matter if no object has been added to the list. The code runs without exception. The problem is that of two call graph edges that are part of the same basic block (remove() and free()), only one call graph edge (remove()) is being returned, which is strange.<u></u><u></u></p></div></div><div><div><div><p class="MsoNormal"> <u></u><u></u></p><div><p class="MsoNormal">On Mon, Feb 9, 2015 at 8:19 PM, Sam Blackshear &lt;<a href="mailto:samuel.blackshear@colorado.edu" target="_blank">samuel.blackshear@colorado.edu</a>&gt; wrote:<u></u><u></u></p><div><div><div><p class="MsoNormal"><span style="font-size:10.0pt">Hi Peter,</span><u></u><u></u></p></div><p class="MsoNormal"><span style="font-size:10.0pt">  My suspicion is that the callgraph is correct here. You never add anything the the objects ArrayList, so whenever you try to read a BaseTweet object out of the list, the analysis (correctly) concludes that only null could be returned. If you call a method on null (like isFinished), the call graph (correctly) concludes that this would result in an NPE and thus does not add the edge. If you want to see these edges in the callgraph, extend your code to add something to the objects ArrayList:</span><u></u><u></u></p><div><div><p class="MsoNormal"><span style="font-size:10.0pt"> </span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:10.0pt">objects.add(new BaseTweet())</span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:10.0pt"> </span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:10.0pt">When debugging your static analysis results, it&#39;s often helpful to concretely execute your target program and be sure that it behaves as you expect!</span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:10.0pt"> </span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:10.0pt">- Sam</span><u></u><u></u></p></div></div><div><p class="MsoNormal"><span style="font-size:10.0pt"> </span><u></u><u></u></p></div></div></div><div><p class="MsoNormal"> <u></u><u></u></p><div><div><div><p class="MsoNormal">On Mon, Feb 9, 2015 at 12:40 PM, Peter Kim &lt;<a href="mailto:chpkim@gmail.com" target="_blank">chpkim@gmail.com</a>&gt; wrote:<u></u><u></u></p></div></div><blockquote style="border:none;border-left:solid #cccccc 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0cm;margin-bottom:5.0pt"><div><div><div><p class="MsoNormal">Hi Steven,<u></u><u></u></p><div><p class="MsoNormal"> <u></u><u></u></p></div><div><p class="MsoNormal">Here is a complete minimal example as an Eclipse project (just import into your workspace): <a href="https://drive.google.com/file/d/0B9KLXcAovVUHa0FuN3gzRGJETmc/view" target="_blank">https://drive.google.com/file/d/0B9KLXcAovVUHa0FuN3gzRGJETmc/view</a><u></u><u></u></p></div><div><p class="MsoNormal"> <u></u><u></u></p></div><div><p class="MsoNormal">I retrieve the CFG of this app at Infoflow.runAnalysis(final ISourceSinkManager sourcesSinks, final Set&lt;String&gt; additionalSeeds), calling &quot;CallGraph cg = Scene.v().getCallGraph();&quot; right before &quot;iCfg = icfgFactory.buildBiDirICFG(callgraphAlgorithm);&quot;. I use cg, not iCfg.<u></u><u></u></p></div><div><p class="MsoNormal"> <u></u><u></u></p></div><div><p class="MsoNormal">The edges out of com.example.toyandroid.ChpkimMainActivity.chpkimUpdate() I get are:<u></u><u></u></p></div><div><p class="MsoNormal"> <u></u><u></u></p></div><div><div><p class="MsoNormal">&lt;java.util.ArrayList: int size()&gt;<u></u><u></u></p></div><div><p class="MsoNormal">&lt;java.util.ArrayList: java.lang.Object get(int)&gt;<u></u><u></u></p></div><div><p class="MsoNormal">&lt;java.util.ArrayList: java.lang.Object remove(int)&gt;<u></u><u></u></p></div><div><p class="MsoNormal"> <u></u><u></u></p></div><div><p class="MsoNormal">But they should be:<u></u><u></u></p></div><div><div><p class="MsoNormal"> <u></u><u></u></p></div><div><p class="MsoNormal">&lt;java.util.ArrayList: int size()&gt;<u></u><u></u></p></div><div><p class="MsoNormal">&lt;java.util.ArrayList: java.lang.Object get(int)&gt;<u></u><u></u></p></div><div><p class="MsoNormal">&lt;java.util.ArrayList: java.lang.Object remove(int)&gt;<u></u><u></u></p></div></div><div><p class="MsoNormal">&lt;com.example.toyandroid.BaseTweet: boolean isFinished()&gt;<u></u><u></u></p></div><div><p class="MsoNormal">&lt;com.example.toyandroid.BaseTweet: void free()&gt;<u></u><u></u></p></div><div><p class="MsoNormal">&lt;com.example.toyandroid.BaseTweet: void update(float)&gt;<u></u><u></u></p></div><div><p class="MsoNormal"> <u></u><u></u></p></div><div><p class="MsoNormal">Thanks for your help.<u></u><u></u></p></div><div><p class="MsoNormal"> <u></u><u></u></p></div></div><div><p class="MsoNormal"> <u></u><u></u></p></div><div><p class="MsoNormal"> <u></u><u></u></p></div><div><p class="MsoNormal"> <u></u><u></u></p></div><div><p class="MsoNormal"> <u></u><u></u></p></div></div><div><div><div><p class="MsoNormal"> <u></u><u></u></p><div><p class="MsoNormal">On Mon, Feb 9, 2015 at 8:40 AM, Steven Arzt &lt;<a href="mailto:Steven.Arzt@cased.de" target="_blank">Steven.Arzt@cased.de</a>&gt; wrote:<u></u><u></u></p><div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">Hi Peter,</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">Can you please send me a more complete minimal example with which I can reproduce the issue?</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">Best regards,</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">  Steven</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;">Von:</span></b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;"> <a href="mailto:soot-list-bounces@CS.McGill.CA" target="_blank">soot-list-bounces@CS.McGill.CA</a> [mailto:<a href="mailto:soot-list-bounces@CS.McGill.CA" target="_blank">soot-list-bounces@CS.McGill.CA</a>] <b>Im Auftrag von </b>Peter Kim<br><b>Gesendet:</b> Sonntag, 8. Februar 2015 19:05<br><b>An:</b> Steven Arzt<br><b>Cc:</b> <a href="mailto:soot-list@cs.mcgill.ca" target="_blank">soot-list@cs.mcgill.ca</a><br><b>Betreff:</b> Re: [Soot-list] Missing call graph edges</span><u></u><u></u></p><div><div><p class="MsoNormal"> <u></u><u></u></p><div><p class="MsoNormal">eliminateDeadCode() is *not* being called and I&#39;m still running into the problem. Thanks in advance for your help.<u></u><u></u></p></div><div><p class="MsoNormal"> <u></u><u></u></p><div><p class="MsoNormal">On Sun, Feb 8, 2015 at 5:37 PM, Peter Kim &lt;<a href="mailto:chpkim@gmail.com" target="_blank">chpkim@gmail.com</a>&gt; wrote:<u></u><u></u></p><div><p class="MsoNormal">Hi Steven,<u></u><u></u></p><div><p class="MsoNormal"> <u></u><u></u></p></div><div><p class="MsoNormal">I&#39;m still running into the same problem after pulling from Github.<u></u><u></u></p></div><div><p class="MsoNormal"> <u></u><u></u></p></div></div><div><div><div><p class="MsoNormal"> <u></u><u></u></p><div><p class="MsoNormal">On Fri, Feb 6, 2015 at 9:24 AM, Steven Arzt &lt;<a href="mailto:Steven.Arzt@cased.de" target="_blank">Steven.Arzt@cased.de</a>&gt; wrote:<u></u><u></u></p><div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">Hi Peter,</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">that might have to do with an optimization I added recently. In short, FlowDroid removes these callgraph edges for which it can easily decide that having them does not influence the outcome of the taint analysis. I can however fully understand that this might lead to surprising results if you are using the FlowDroid components for other analyses, so I decided to make this optimization optional and turn it off by default.</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">The new code is on Github and a new nightly build will be available tomorrow.</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">Best regards,</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">  Steven</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:13.5pt;font-family:&quot;Courier New&quot;;color:black">M.Sc. M.Sc. Steven Arzt</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:&quot;Courier New&quot;;color:black">Secure Software Engineering Group (SSE)</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:&quot;Courier New&quot;;color:black">European Center for Security and Privacy by Design (EC SPRIDE) </span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:10.0pt;font-family:&quot;Courier New&quot;;color:black">Rheinstraße 75</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:10.0pt;font-family:&quot;Courier New&quot;;color:black">D-64293 Darmstadt</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:10.0pt;font-family:&quot;Courier New&quot;;color:black">Phone: +49 61 51 869-336</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:10.0pt;font-family:&quot;Courier New&quot;;color:black">Fax: <a href="tel:%2B49%2061%2051%2016-72118" target="_blank">+49 61 51 16-72118</a></span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:&quot;Courier New&quot;;color:black">eMail: </span><span style="font-size:10.0pt;font-family:&quot;Courier New&quot;;color:black"><a href="mailto:steven.arzt@ec-spride.de" target="_blank"><span lang="EN-US">steven.arzt@ec-spride.de</span></a></span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:10.0pt;font-family:&quot;Courier New&quot;;color:black">Web: <a href="http://sse.ec-spride.de/" target="_blank">http://sse.ec-spride.de</a></span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;">Von:</span></b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;"> <a href="mailto:soot-list-bounces@CS.McGill.CA" target="_blank">soot-list-bounces@CS.McGill.CA</a> [mailto:<a href="mailto:soot-list-bounces@CS.McGill.CA" target="_blank">soot-list-bounces@CS.McGill.CA</a>] <b>Im Auftrag von </b>Peter Kim<br><b>Gesendet:</b> Freitag, 6. Februar 2015 00:05<br><b>An:</b> <a href="mailto:soot-list@cs.mcgill.ca" target="_blank">soot-list@cs.mcgill.ca</a><br><b>Betreff:</b> [Soot-list] Missing call graph edges</span><u></u><u></u></p><div><div><p class="MsoNormal"> <u></u><u></u></p><div><p class="MsoNormal">Hi,<u></u><u></u></p><div><p class="MsoNormal"> <u></u><u></u></p></div><div><p class="MsoNormal">I&#39;m extending FlowDroid to construct an Android app&#39;s call graph. More specifically, I get the call graph by modifying Infoflow.runAnalysis(final ISourceSinkManager sourcesSinks, final Set&lt;String&gt; additionalSeeds) to call Scene.v().getCallGraph(). The call graph is missing edges in an odd way - for a function, the graph has some outgoing edges but is missing ones that should be there. Namely, given the following function (shown in Java rather than jimple for readability), the called methods should be &quot;get()&quot;, &quot;isFinished()&quot;, &quot;remove()&quot;, &quot;free()&quot;, &quot;size()&quot;, &quot;update()&quot;, but I&#39;m only getting &quot;get()&quot;, &quot;size()&quot;, and &quot;remove()&quot;. I don&#39;t understand why &quot;remove()&quot; is included but &quot;free()&quot; is not since they are in the same basic block. I&#39;m using soot.jimple.toolkits.callgraph.TransitiveTargets to analyze the call graph.<u></u><u></u></p></div><div><p class="MsoNormal"> <u></u><u></u></p></div><div><div><p class="MsoNormal">public void update(float x) {<u></u><u></u></p></div><div><p class="MsoNormal">  for (...size()..) {<u></u><u></u></p></div><div><p class="MsoNormal">      get();<u></u><u></u></p></div><div><p class="MsoNormal">      if (isFinished()) {<u></u><u></u></p></div><div><p class="MsoNormal">        remove();<u></u><u></u></p></div><div><p class="MsoNormal">        free();<u></u><u></u></p></div><div><p class="MsoNormal">      }<u></u><u></u></p></div><div><p class="MsoNormal">  }<u></u><u></u></p></div><div><p class="MsoNormal"> <u></u><u></u></p></div><div><p class="MsoNormal">  if (y) {<u></u><u></u></p></div><div><p class="MsoNormal">    if (x) {<u></u><u></u></p></div><div><p class="MsoNormal">      for (... size()...)  get().update(x);<u></u><u></u></p></div><div><p class="MsoNormal">    } else {<u></u><u></u></p></div><div><p class="MsoNormal">      for (...size()...)  get().update(x);<u></u><u></u></p></div><div><p class="MsoNormal">    }<u></u><u></u></p></div><div><p class="MsoNormal">  }<u></u><u></u></p></div><div><p class="MsoNormal">}<u></u><u></u></p></div></div><div><p class="MsoNormal"> <u></u><u></u></p></div><div><p class="MsoNormal">Thank you for your help.<u></u><u></u></p></div><div><p class="MsoNormal"> <u></u><u></u></p></div></div></div></div></div></div></div><p class="MsoNormal"> <u></u><u></u></p></div></div></div></div><p class="MsoNormal"> <u></u><u></u></p></div></div></div></div></div></div><p class="MsoNormal"> <u></u><u></u></p></div></div></div><p class="MsoNormal"> <u></u><u></u></p></div></div><p class="MsoNormal" style="margin-bottom:12.0pt">_______________________________________________<br>Soot-list mailing list<br><a href="mailto:Soot-list@CS.McGill.CA" target="_blank">Soot-list@CS.McGill.CA</a><br><a href="https://mailman.CS.McGill.CA/mailman/listinfo/soot-list" target="_blank">https://mailman.CS.McGill.CA/mailman/listinfo/soot-list</a><u></u><u></u></p></blockquote></div><p class="MsoNormal"> <u></u><u></u></p></div></div><p class="MsoNormal"> <u></u><u></u></p></div></div></div></div><p class="MsoNormal"> <u></u><u></u></p></div></div></div></div><p class="MsoNormal"> <u></u><u></u></p></div></div></div></div><p class="MsoNormal"> <u></u><u></u></p></div></div></div></div><p class="MsoNormal"> <u></u><u></u></p></div></div></div></div></div></div><p class="MsoNormal"> <u></u><u></u></p></div></div></div></div></div></div><p class="MsoNormal"><u></u> <u></u></p></div></div></div></div></div></blockquote></div><br></div>