[Soot-list] Spark Error with Flowdroid
Saswat Anand
saswat78 at gmail.com
Sat Jun 15 19:27:34 EDT 2013
Does the error occur when you switch off the use-original-names option?
On Sat, Jun 15, 2013 at 1:25 PM, Marc-André Laverdière-Papineau
<marc-andre.laverdiere-papineau at polymtl.ca> wrote:
> Hello,
>
> I decided to just catch the exception :) From what I can tell, it is not
> picking up the type com.oreilly.servlet.multipart.Part for l8
>
>
> Exception in thread "main" java.lang.RuntimeException: Error building
> local in method <com.oreilly.servlet.MultipartRequest: void
> <init>(javax.servlet.http.HttpServletRequest,java.lang.String,int,java.lang.String,com.oreilly.servlet.multipart.FileRenamePolicy)>
> for local: l8
> Body: public void <init>(javax.servlet.http.HttpServletRequest,
> java.lang.String, int, java.lang.String,
> com.oreilly.servlet.multipart.FileRenamePolicy) throws java.io.IOException
> {
> com.oreilly.servlet.MultipartRequest this;
> javax.servlet.http.HttpServletRequest request;
> java.lang.String saveDirectory, encoding, name, value, fileName,
> $r10, $r15, $r17, $r18, $r21, $r31, $r32, $r33;
> int maxPostSize, i, $i0;
> com.oreilly.servlet.multipart.FileRenamePolicy policy;
> java.util.Hashtable $r0, queryParameters, $r1, $r22, $r24, $r27,
> $r29, $r35;
> java.io.File dir, $r5;
> com.oreilly.servlet.multipart.MultipartParser parser, $r16;
> java.util.Enumeration queryParameterNames;
> java.lang.Object paramName, $r19, $r25;
> java.lang.String[] values;
> java.util.Vector newValues, existingValues, $r20, $r26;
> bottom_type l8;
> com.oreilly.servlet.multipart.ParamPart paramPart;
> com.oreilly.servlet.multipart.FilePart filePart;
> com.oreilly.servlet.multipart.Part part, $r38;
> java.lang.IllegalArgumentException $r2, $r3, $r4, $r6, $r11;
> boolean $z0, $z1, $z3, $z4, $z5;
> java.lang.StringBuffer $r7, $r8, $r9, $r12, $r13, $r14;
> com.oreilly.servlet.UploadedFile $r30, $r36;
>
> this := @this: com.oreilly.servlet.MultipartRequest;
> request := @parameter0: javax.servlet.http.HttpServletRequest;
> saveDirectory := @parameter1: java.lang.String;
> maxPostSize := @parameter2: int;
> encoding := @parameter3: java.lang.String;
> policy := @parameter4:
> com.oreilly.servlet.multipart.FileRenamePolicy;
> specialinvoke this.<java.lang.Object: void <init>()>();
> $r0 = new java.util.Hashtable;
> specialinvoke $r0.<java.util.Hashtable: void <init>()>();
> this.<com.oreilly.servlet.MultipartRequest: java.util.Hashtable
> parameters> = $r0;
> $r1 = new java.util.Hashtable;
> specialinvoke $r1.<java.util.Hashtable: void <init>()>();
> this.<com.oreilly.servlet.MultipartRequest: java.util.Hashtable
> files> = $r1;
> if request != null goto label0;
>
> $r2 = new java.lang.IllegalArgumentException;
> specialinvoke $r2.<java.lang.IllegalArgumentException: void
> <init>(java.lang.String)>("request cannot be null");
> throw $r2;
>
> label0:
> if saveDirectory != null goto label1;
>
> $r3 = new java.lang.IllegalArgumentException;
> specialinvoke $r3.<java.lang.IllegalArgumentException: void
> <init>(java.lang.String)>("saveDirectory cannot be null");
> throw $r3;
>
> label1:
> if maxPostSize > 0 goto label2;
>
> $r4 = new java.lang.IllegalArgumentException;
> specialinvoke $r4.<java.lang.IllegalArgumentException: void
> <init>(java.lang.String)>("maxPostSize must be positive");
> throw $r4;
>
> label2:
> $r5 = new java.io.File;
> specialinvoke $r5.<java.io.File: void
> <init>(java.lang.String)>(saveDirectory);
> dir = $r5;
> $z0 = virtualinvoke dir.<java.io.File: boolean isDirectory()>();
> if $z0 != 0 goto label3;
>
> $r6 = new java.lang.IllegalArgumentException;
> $r7 = new java.lang.StringBuffer;
> specialinvoke $r7.<java.lang.StringBuffer: void <init>()>();
> $r8 = virtualinvoke $r7.<java.lang.StringBuffer:
> java.lang.StringBuffer append(java.lang.String)>("Not a directory: ");
> $r9 = virtualinvoke $r8.<java.lang.StringBuffer:
> java.lang.StringBuffer append(java.lang.String)>(saveDirectory);
> $r10 = virtualinvoke $r9.<java.lang.StringBuffer:
> java.lang.String toString()>();
> specialinvoke $r6.<java.lang.IllegalArgumentException: void
> <init>(java.lang.String)>($r10);
> throw $r6;
>
> label3:
> $z1 = virtualinvoke dir.<java.io.File: boolean canWrite()>();
> if $z1 != 0 goto label4;
>
> $r11 = new java.lang.IllegalArgumentException;
> $r12 = new java.lang.StringBuffer;
> specialinvoke $r12.<java.lang.StringBuffer: void <init>()>();
> $r13 = virtualinvoke $r12.<java.lang.StringBuffer:
> java.lang.StringBuffer append(java.lang.String)>("Not writable: ");
> $r14 = virtualinvoke $r13.<java.lang.StringBuffer:
> java.lang.StringBuffer append(java.lang.String)>(saveDirectory);
> $r15 = virtualinvoke $r14.<java.lang.StringBuffer:
> java.lang.String toString()>();
> specialinvoke $r11.<java.lang.IllegalArgumentException: void
> <init>(java.lang.String)>($r15);
> throw $r11;
>
> label4:
> $r16 = new com.oreilly.servlet.multipart.MultipartParser;
> specialinvoke
> $r16.<com.oreilly.servlet.multipart.MultipartParser: void
> <init>(javax.servlet.http.HttpServletRequest,int,boolean,boolean,java.lang.String)>(request,
> maxPostSize, 1, 1, encoding);
> parser = $r16;
> $r17 = interfaceinvoke
> request.<javax.servlet.http.HttpServletRequest: java.lang.String
> getQueryString()>();
> if $r17 == null goto label13;
>
> $r18 = interfaceinvoke
> request.<javax.servlet.http.HttpServletRequest: java.lang.String
> getQueryString()>();
> queryParameters = staticinvoke <javax.servlet.http.HttpUtils:
> java.util.Hashtable parseQueryString(java.lang.String)>($r18);
> queryParameterNames = virtualinvoke
> queryParameters.<java.util.Hashtable: java.util.Enumeration keys()>();
> goto label8;
>
> label5:
> paramName = interfaceinvoke
> queryParameterNames.<java.util.Enumeration: java.lang.Object
> nextElement()>();
> $r19 = virtualinvoke queryParameters.<java.util.Hashtable:
> java.lang.Object get(java.lang.Object)>(paramName);
> values = (java.lang.String[]) $r19;
> $r20 = new java.util.Vector;
> specialinvoke $r20.<java.util.Vector: void <init>()>();
> newValues = $r20;
> i = 0;
> goto label7;
>
> label6:
> $r21 = values[i];
> virtualinvoke newValues.<java.util.Vector: boolean
> add(java.lang.Object)>($r21);
> i = i + 1;
>
> label7:
> $i0 = lengthof values;
> if i < $i0 goto label6;
>
> $r22 = this.<com.oreilly.servlet.MultipartRequest:
> java.util.Hashtable parameters>;
> virtualinvoke $r22.<java.util.Hashtable: java.lang.Object
> put(java.lang.Object,java.lang.Object)>(paramName, newValues);
>
> label8:
> $z3 = interfaceinvoke
> queryParameterNames.<java.util.Enumeration: boolean hasMoreElements()>();
> if $z3 != 0 goto label5;
>
> goto label13;
>
> label9:
> name = virtualinvoke l8.<com.oreilly.servlet.multipart.Part:
> java.lang.String getName()>();
> $z4 = virtualinvoke l8.<com.oreilly.servlet.multipart.Part:
> boolean isParam()>();
> if $z4 == 0 goto label11;
>
> paramPart = (com.oreilly.servlet.multipart.ParamPart) l8;
> value = virtualinvoke
> paramPart.<com.oreilly.servlet.multipart.ParamPart: java.lang.String
> getStringValue()>();
> $r24 = this.<com.oreilly.servlet.MultipartRequest:
> java.util.Hashtable parameters>;
> $r25 = virtualinvoke $r24.<java.util.Hashtable: java.lang.Object
> get(java.lang.Object)>(name);
> existingValues = (java.util.Vector) $r25;
> if existingValues != null goto label10;
>
> $r26 = new java.util.Vector;
> specialinvoke $r26.<java.util.Vector: void <init>()>();
> existingValues = $r26;
> $r27 = this.<com.oreilly.servlet.MultipartRequest:
> java.util.Hashtable parameters>;
> virtualinvoke $r27.<java.util.Hashtable: java.lang.Object
> put(java.lang.Object,java.lang.Object)>(name, existingValues);
>
> label10:
> virtualinvoke existingValues.<java.util.Vector: void
> addElement(java.lang.Object)>(value);
> goto label13;
>
> label11:
> $z5 = virtualinvoke l8.<com.oreilly.servlet.multipart.Part:
> boolean isFile()>();
> if $z5 == 0 goto label13;
>
> filePart = (com.oreilly.servlet.multipart.FilePart) l8;
> fileName = virtualinvoke
> filePart.<com.oreilly.servlet.multipart.FilePart: java.lang.String
> getFileName()>();
> if fileName == null goto label12;
>
> virtualinvoke filePart.<com.oreilly.servlet.multipart.FilePart:
> void
> setRenamePolicy(com.oreilly.servlet.multipart.FileRenamePolicy)>(policy);
> virtualinvoke filePart.<com.oreilly.servlet.multipart.FilePart:
> long writeTo(java.io.File)>(dir);
> $r29 = this.<com.oreilly.servlet.MultipartRequest:
> java.util.Hashtable files>;
> $r30 = new com.oreilly.servlet.UploadedFile;
> $r31 = virtualinvoke dir.<java.io.File: java.lang.String
> toString()>();
> $r32 = virtualinvoke
> filePart.<com.oreilly.servlet.multipart.FilePart: java.lang.String
> getFileName()>();
> $r33 = virtualinvoke
> filePart.<com.oreilly.servlet.multipart.FilePart: java.lang.String
> getContentType()>();
> specialinvoke $r30.<com.oreilly.servlet.UploadedFile: void
> <init>(java.lang.String,java.lang.String,java.lang.String,java.lang.String)>($r31,
> $r32, fileName, $r33);
> virtualinvoke $r29.<java.util.Hashtable: java.lang.Object
> put(java.lang.Object,java.lang.Object)>(name, $r30);
> goto label13;
>
> label12:
> $r35 = this.<com.oreilly.servlet.MultipartRequest:
> java.util.Hashtable files>;
> $r36 = new com.oreilly.servlet.UploadedFile;
> specialinvoke $r36.<com.oreilly.servlet.UploadedFile: void
> <init>(java.lang.String,java.lang.String,java.lang.String,java.lang.String)>(null,
> null, null, null);
> virtualinvoke $r35.<java.util.Hashtable: java.lang.Object
> put(java.lang.Object,java.lang.Object)>(name, $r36);
>
> label13:
> $r38 = virtualinvoke
> parser.<com.oreilly.servlet.multipart.MultipartParser:
> com.oreilly.servlet.multipart.Part readNextPart()>();
> part = $r38;
> if $r38 != null goto label9;
>
> return;
> }
>
> The source code is here:
> http://www.jarvana.com/jarvana/view/com/servlets/cos/05Nov2002/cos-05Nov2002-sources.jar!/com/oreilly/servlet/MultipartRequest.java?format=ok
>
> Got any clue how to fix that?
>
> P.S. I am loading it from the pre-compiled jar file - so this is not a
> bug in the java source front-end.
>
> Marc-André Laverdière-Papineau
> Doctorant - PhD Candidate
>
> On 14/06/13 11:17 PM, Saswat Anand wrote:
>> You can print out the method name and entire jimple body inside the
>> buildNormal method, which appears in the stack trace. The last method
>> to be printed before the exception is the offending method.
>>
>>
>> On Fri, Jun 14, 2013 at 5:59 PM, Marc-André Laverdière
>> <marc-andre.laverdiere-papineau at polymtl.ca> wrote:
>>> Hi,
>>>
>>> Would you please let me know how I can get the offending method? This is sort of black box...
>>> --
>>> Marc-André Laverdière
>>> PhD Candidate - Doctorant
>>> Sent from a mobile device - please excuse the brevity
>>>
>>> Saswat Anand <saswat78 at gmail.com> wrote:
>>> >From the stack trace, it looks like one of the local has a "bottom"
>>>> type. One possible cause is that the type assigner is failing to
>>>> assign correct types to locals in the Jimple code that Dexpler
>>>> produces.
>>>>
>>>> If you could open a new issue with the jimple and .smali code for the
>>>> offending method, that would help in debugging.
>>>>
>>>> Saswat
>>>>
>>>>
>>>> On Fri, Jun 14, 2013 at 1:28 PM, Marc-André Laverdière-Papineau
>>>> <marc-andre.laverdiere-papineau at polymtl.ca> wrote:
>>>>> Hello everyone,
>>>>>
>>>>> I am using Flowdroid and was able to do some analyses this week. But
>>>>> after some fiddling (mostly improving the sources and sinks), I end
>>>> up
>>>>> getting this error.
>>>>>
>>>>> Exception in thread "main" java.lang.RuntimeException: Attempt to
>>>> create
>>>>> VarNode of type bottom_type
>>>>> at soot.jimple.spark.pag.VarNode.<init>(VarNode.java:106)
>>>>> at
>>>> soot.jimple.spark.pag.LocalVarNode.<init>(LocalVarNode.java:44)
>>>>> at soot.jimple.spark.pag.PAG.makeLocalVarNode(PAG.java:539)
>>>>> at
>>>>>
>>>> soot.jimple.spark.builder.MethodNodeFactory.caseLocal(MethodNodeFactory.java:219)
>>>>> at
>>>> soot.jimple.internal.JimpleLocal.apply(JimpleLocal.java:132)
>>>>> at
>>>>>
>>>> soot.jimple.spark.builder.MethodNodeFactory.caseCastExpr(MethodNodeFactory.java:190)
>>>>> at
>>>> soot.jimple.internal.AbstractCastExpr.apply(AbstractCastExpr.java:127)
>>>>> at
>>>>>
>>>> soot.jimple.spark.builder.MethodNodeFactory$1.caseAssignStmt(MethodNodeFactory.java:78)
>>>>> at
>>>> soot.jimple.internal.JAssignStmt.apply(JAssignStmt.java:221)
>>>>> at
>>>>>
>>>> soot.jimple.spark.builder.MethodNodeFactory.handleStmt(MethodNodeFactory.java:69)
>>>>> at
>>>> soot.jimple.spark.pag.MethodPAG.buildNormal(MethodPAG.java:181)
>>>>> at soot.jimple.spark.pag.MethodPAG.build(MethodPAG.java:147)
>>>>> at
>>>>>
>>>> soot.jimple.spark.solver.OnFlyCallGraph.processReachables(OnFlyCallGraph.java:64)
>>>>> at
>>>> soot.jimple.spark.solver.OnFlyCallGraph.build(OnFlyCallGraph.java:56)
>>>>> at
>>>>>
>>>> soot.jimple.spark.solver.PropWorklist.handleVarNode(PropWorklist.java:123)
>>>>> at
>>>> soot.jimple.spark.solver.PropWorklist.propagate(PropWorklist.java:53)
>>>>> at
>>>>>
>>>> soot.jimple.spark.SparkTransformer.internalTransform(SparkTransformer.java:152)
>>>>>
>>>>> I really have no idea what is causing this and what I can do about
>>>> it.
>>>>> Any suggestions?
>>>>>
>>>>> --
>>>>> Marc-André Laverdière-Papineau
>>>>> Doctorant - PhD Candidate
>>>>> _______________________________________________
>>>>> Soot-list mailing list
>>>>> Soot-list at sable.mcgill.ca
>>>>> http://mailman.cs.mcgill.ca/mailman/listinfo/soot-list
>>>
>>
> _______________________________________________
> Soot-list mailing list
> Soot-list at sable.mcgill.ca
> http://mailman.cs.mcgill.ca/mailman/listinfo/soot-list
More information about the Soot-list
mailing list