[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