[Soot-list] Spark Error with Flowdroid

Marc-André Laverdière-Papineau marc-andre.laverdiere-papineau at polymtl.ca
Sat Jun 15 16:25:48 EDT 2013


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
>>
> 


More information about the Soot-list mailing list