Skip to content

The results of running FlowDroid multiple times are inconsistent. #790

Open
@litter47

Description

@litter47

Dear Dr. Arzt,

I have observed a phenomenon but am unsure of the exact cause.I used the core analysis engine of FlowDroid to run a Java program and found that the results were inconsistent across multiple runs.After an Abstraction reaches the sink point and begins the process of tracing back the call chain, it produces different results, even though the Abstraction that reaches the sink point is the same.

The structure of the Abstraction that reaches the sink is:
Current Abstraction: r1(javax.servlet.ServletRequest) * <+length> | >>
-> Neighbor Abstraction: r1(javax.servlet.ServletRequest) * <+length> | >>
-> Neighbor Abstraction: r1(javax.servlet.ServletRequest) * <+length> | >>
-> Predecessor Abstraction: r1(javax.servlet.ServletRequest) * <+length> | >>
Current Abstraction: r1(javax.servlet.ServletRequest) * <+length> | >>
-> Neighbor Abstraction: r1(javax.servlet.ServletRequest) * <+length> | >>
-> Neighbor Abstraction: r1(javax.servlet.ServletRequest) * <+length> | >>
-> Neighbor Abstraction: r1(javax.servlet.ServletRequest) * <+length> | >>
-> Neighbor Abstraction: r1(javax.servlet.ServletRequest) * <+length> | >>
-> Neighbor Abstraction: r1(javax.servlet.ServletRequest) * <+length> | >>
-> Neighbor Abstraction: r1(javax.servlet.ServletRequest) * <+length> | >>
-> Neighbor Abstraction: r1(javax.servlet.ServletRequest) * <+length> | >>
-> Neighbor Abstraction: r1(javax.servlet.ServletRequest) * <+length> | >>
-> Neighbor Abstraction: r1(javax.servlet.ServletRequest) * <+length> | >>
-> Neighbor Abstraction: r1(javax.servlet.ServletRequest) * <+length> | >>
-> Neighbor Abstraction: r1(javax.servlet.ServletRequest) * <+length> | >>
-> Neighbor Abstraction: r1(javax.servlet.ServletRequest) * <+length> | >>
-> Neighbor Abstraction: r1(javax.servlet.ServletRequest) * <+length> | >>
-> Neighbor Abstraction: r1(javax.servlet.ServletRequest) * <+length> | >>
-> Neighbor Abstraction: r1(javax.servlet.ServletRequest) * <+length> | >>
-> Neighbor Abstraction: r1(javax.servlet.ServletRequest) * <+length> | >>
-> Predecessor Abstraction: r1(javax.servlet.ServletRequest) * <+length> | >>
Current Abstraction: r1(javax.servlet.ServletRequest) * <+length> | >>
-> Neighbor Abstraction: r1(javax.servlet.ServletRequest) * <+length> | >>
-> Neighbor Abstraction: r1(javax.servlet.ServletRequest) * <+length> | >>
-> Neighbor Abstraction: r1(javax.servlet.ServletRequest) * <+length> | >>
-> Neighbor Abstraction: r1(javax.servlet.ServletRequest) * <+length> | >>
-> Neighbor Abstraction: r1(javax.servlet.ServletRequest) * <+length> | >>
-> Predecessor Abstraction: $r2(javax.servlet.ServletRequest) * <+length> | >>
Current Abstraction: $r2(javax.servlet.ServletRequest) * <+length> | >>
-> Neighbor Abstraction: $r2(javax.servlet.ServletRequest) * <+length> | >>
-> Predecessor Abstraction: r0(org.apache.catalina.core.ApplicationFilterChain$1) <org.apache.catalina.core.ApplicationFilterChain$1: javax.servlet.ServletRequest val$req> * <+length> | >>
Current Abstraction: r0(org.apache.catalina.core.ApplicationFilterChain$1) <org.apache.catalina.core.ApplicationFilterChain$1: javax.servlet.ServletRequest val$req> * <+length> | >>
-> Neighbor Abstraction: r0(org.apache.catalina.core.ApplicationFilterChain$1) <org.apache.catalina.core.ApplicationFilterChain$1: javax.servlet.ServletRequest val$req> * <+length> | >>
-> Neighbor Abstraction: r0(org.apache.catalina.core.ApplicationFilterChain$1) <org.apache.catalina.core.ApplicationFilterChain$1: javax.servlet.ServletRequest val$req> * <+length> | >>
-> Neighbor Abstraction: r0(org.apache.catalina.core.ApplicationFilterChain$1) <org.apache.catalina.core.ApplicationFilterChain$1: javax.servlet.ServletRequest val$req> * <+length> | >>
-> Neighbor Abstraction: r0(org.apache.catalina.core.ApplicationFilterChain$1) <org.apache.catalina.core.ApplicationFilterChain$1: javax.servlet.ServletRequest val$req> * <+length> | >>
-> Predecessor Abstraction: $r3(org.apache.catalina.core.ApplicationFilterChain$1) <org.apache.catalina.core.ApplicationFilterChain$1: javax.servlet.ServletRequest val$req> * <+length> | >>
Current Abstraction: $r3(org.apache.catalina.core.ApplicationFilterChain$1) <org.apache.catalina.core.ApplicationFilterChain$1: javax.servlet.ServletRequest val$req> * <+length> | >>
-> Predecessor Abstraction: r0(org.apache.catalina.core.ApplicationFilterChain$1) <org.apache.catalina.core.ApplicationFilterChain$1: javax.servlet.ServletRequest val$req> * <+length> | >>
Current Abstraction: r0(org.apache.catalina.core.ApplicationFilterChain$1) <org.apache.catalina.core.ApplicationFilterChain$1: javax.servlet.ServletRequest val$req> * <+length> | >>
-> Predecessor Abstraction: r2(org.apache.catalina.connector.RequestFacade) * <+length> | >>
Current Abstraction: r2(org.apache.catalina.connector.RequestFacade) * <+length> | >>
-> Predecessor Abstraction: r1(org.apache.catalina.connector.RequestFacade) * <+length> | >>
Current Abstraction: r1(org.apache.catalina.connector.RequestFacade) * <+length> | >>
-> Neighbor Abstraction: r1(org.apache.catalina.connector.RequestFacade) * <+length> | >>
-> Neighbor Abstraction: r1(org.apache.catalina.connector.RequestFacade) * <+length> | >>
-> Neighbor Abstraction: r1(org.apache.catalina.connector.RequestFacade) * <+length> | >>
-> Neighbor Abstraction: r1(org.apache.catalina.connector.RequestFacade) * <+length> | >>
-> Neighbor Abstraction: r1(org.apache.catalina.connector.RequestFacade) * <+length> | >>
-> Neighbor Abstraction: r1(org.apache.catalina.connector.RequestFacade) * <+length> | >>
-> Neighbor Abstraction: r1(org.apache.catalina.connector.RequestFacade) * <+length> | >>
-> Neighbor Abstraction: r1(org.apache.catalina.connector.RequestFacade) * <+length> | >>
-> Neighbor Abstraction: r1(org.apache.catalina.connector.RequestFacade) * <+length> | >>
-> Neighbor Abstraction: r1(org.apache.catalina.connector.RequestFacade) * <+length> | >>
-> Predecessor Abstraction: servletrequest(org.apache.catalina.connector.RequestFacade) * <+length> | >>
Current Abstraction: servletrequest(org.apache.catalina.connector.RequestFacade) * <+length> | >>
-> Predecessor Abstraction: request(org.apache.catalina.connector.RequestFacade) * <+length> | >>
Current Abstraction: request(org.apache.catalina.connector.RequestFacade) * <+length> | >>
No more predecessors.

The execution results are as follows:
1:
09:36:24.639 [main] INFO auth.jarInflow.JarAuthInfoflow - on Path:
09:36:24.639 [main] INFO auth.jarInflow.JarAuthInfoflow - -> <dummyMainClass: void dummyMainMethod(java.lang.String[])>
09:36:24.639 [main] INFO auth.jarInflow.JarAuthInfoflow - -> request = virtualinvoke $r7.<org.apache.catalina.connector.Request: javax.servlet.http.HttpServletRequest getRequest()>()
09:36:24.639 [main] INFO auth.jarInflow.JarAuthInfoflow - -> <dummyMainClass: void dummyMainMethod(java.lang.String[])>
09:36:24.639 [main] INFO auth.jarInflow.JarAuthInfoflow - -> servletrequest = (javax.servlet.ServletRequest) request
09:36:24.639 [main] INFO auth.jarInflow.JarAuthInfoflow - -> <dummyMainClass: void dummyMainMethod(java.lang.String[])>
09:36:24.639 [main] INFO auth.jarInflow.JarAuthInfoflow - -> virtualinvoke $r2.<org.apache.catalina.core.ApplicationFilterChain: void doFilter(javax.servlet.ServletRequest,javax.servlet.ServletResponse)>(servletrequest, servletresponse)
09:36:24.639 [main] INFO auth.jarInflow.JarAuthInfoflow - -> <org.apache.catalina.core.ApplicationFilterChain: void doFilter(javax.servlet.ServletRequest,javax.servlet.ServletResponse)>
09:36:24.639 [main] INFO auth.jarInflow.JarAuthInfoflow - -> specialinvoke $r3.<org.apache.catalina.core.ApplicationFilterChain$1: void (org.apache.catalina.core.ApplicationFilterChain,javax.servlet.ServletRequest,javax.servlet.ServletResponse)>(r0, r1, r2)
09:36:24.639 [main] INFO auth.jarInflow.JarAuthInfoflow - -> <org.apache.catalina.core.ApplicationFilterChain$1: void (org.apache.catalina.core.ApplicationFilterChain,javax.servlet.ServletRequest,javax.servlet.ServletResponse)>
09:36:24.639 [main] INFO auth.jarInflow.JarAuthInfoflow - -> r0.<org.apache.catalina.core.ApplicationFilterChain$1: javax.servlet.ServletRequest val$req> = r2
09:36:24.639 [main] INFO auth.jarInflow.JarAuthInfoflow - -> <org.apache.catalina.core.ApplicationFilterChain$1: void (org.apache.catalina.core.ApplicationFilterChain,javax.servlet.ServletRequest,javax.servlet.ServletResponse)>
09:36:24.639 [main] INFO auth.jarInflow.JarAuthInfoflow - -> return
09:36:24.639 [main] INFO auth.jarInflow.JarAuthInfoflow - -> <org.apache.catalina.core.ApplicationFilterChain: void doFilter(javax.servlet.ServletRequest,javax.servlet.ServletResponse)>
09:36:24.639 [main] INFO auth.jarInflow.JarAuthInfoflow - -> staticinvoke <java.security.AccessController: java.lang.Object doPrivileged(java.security.PrivilegedExceptionAction)>($r3)
09:36:24.639 [main] INFO auth.jarInflow.JarAuthInfoflow - -> <org.apache.catalina.core.ApplicationFilterChain$1: java.lang.Void run()>
09:36:24.639 [main] INFO auth.jarInflow.JarAuthInfoflow - -> $r2 = r0.<org.apache.catalina.core.ApplicationFilterChain$1: javax.servlet.ServletRequest val$req>
09:36:24.639 [main] INFO auth.jarInflow.JarAuthInfoflow - -> <org.apache.catalina.core.ApplicationFilterChain$1: java.lang.Void run()>
09:36:24.639 [main] INFO auth.jarInflow.JarAuthInfoflow - -> staticinvoke <org.apache.catalina.core.ApplicationFilterChain: void access$000(org.apache.catalina.core.ApplicationFilterChain,javax.servlet.ServletRequest,javax.servlet.ServletResponse)>($r3, $r2, $r1)
09:36:24.639 [main] INFO auth.jarInflow.JarAuthInfoflow - -> <org.apache.catalina.core.ApplicationFilterChain: void access$000(org.apache.catalina.core.ApplicationFilterChain,javax.servlet.ServletRequest,javax.servlet.ServletResponse)>
09:36:24.639 [main] INFO auth.jarInflow.JarAuthInfoflow - -> specialinvoke r0.<org.apache.catalina.core.ApplicationFilterChain: void internalDoFilter(javax.servlet.ServletRequest,javax.servlet.ServletResponse)>(r1, r2)
09:36:24.639 [main] INFO auth.jarInflow.JarAuthInfoflow - -> <org.apache.catalina.core.ApplicationFilterChain: void internalDoFilter(javax.servlet.ServletRequest,javax.servlet.ServletResponse)>
09:36:24.639 [main] INFO auth.jarInflow.JarAuthInfoflow - -> interfaceinvoke $r38.<javax.servlet.Servlet: void service(javax.servlet.ServletRequest,javax.servlet.ServletResponse)>(r1, r2)
09:36:24.639 [main] INFO auth.jarInflow.JarAuthInfoflow - Data flow solver took 4 seconds. Maximum memory consumption: 1444 MB
09:36:24.640 [main] INFO SetupApplication - Found 1 leaks from 29 sources

2:
09:40:12.596 [main] INFO auth.jarInflow.JarAuthInfoflow - on Path:
09:40:12.596 [main] INFO auth.jarInflow.JarAuthInfoflow - -> <dummyMainClass: void dummyMainMethod(java.lang.String[])>
09:40:12.596 [main] INFO auth.jarInflow.JarAuthInfoflow - -> request = virtualinvoke $r7.<org.apache.catalina.connector.Request: javax.servlet.http.HttpServletRequest getRequest()>()
09:40:12.596 [main] INFO auth.jarInflow.JarAuthInfoflow - -> <dummyMainClass: void dummyMainMethod(java.lang.String[])>
09:40:12.596 [main] INFO auth.jarInflow.JarAuthInfoflow - -> servletrequest = (javax.servlet.ServletRequest) request
09:40:12.596 [main] INFO auth.jarInflow.JarAuthInfoflow - -> <dummyMainClass: void dummyMainMethod(java.lang.String[])>
09:40:12.596 [main] INFO auth.jarInflow.JarAuthInfoflow - -> virtualinvoke $r2.<org.apache.catalina.core.ApplicationFilterChain: void doFilter(javax.servlet.ServletRequest,javax.servlet.ServletResponse)>(servletrequest, servletresponse)
09:40:12.596 [main] INFO auth.jarInflow.JarAuthInfoflow - -> <org.apache.catalina.core.ApplicationFilterChain: void doFilter(javax.servlet.ServletRequest,javax.servlet.ServletResponse)>
09:40:12.596 [main] INFO auth.jarInflow.JarAuthInfoflow - -> specialinvoke $r3.<org.apache.catalina.core.ApplicationFilterChain$1: void (org.apache.catalina.core.ApplicationFilterChain,javax.servlet.ServletRequest,javax.servlet.ServletResponse)>(r0, r1, r2)
09:40:12.596 [main] INFO auth.jarInflow.JarAuthInfoflow - -> <org.apache.catalina.core.ApplicationFilterChain$1: void (org.apache.catalina.core.ApplicationFilterChain,javax.servlet.ServletRequest,javax.servlet.ServletResponse)>
09:40:12.596 [main] INFO auth.jarInflow.JarAuthInfoflow - -> return
09:40:12.596 [main] INFO auth.jarInflow.JarAuthInfoflow - -> <org.apache.catalina.core.ApplicationFilterChain: void doFilter(javax.servlet.ServletRequest,javax.servlet.ServletResponse)>
09:40:12.596 [main] INFO auth.jarInflow.JarAuthInfoflow - -> specialinvoke r0.<org.apache.catalina.core.ApplicationFilterChain: void internalDoFilter(javax.servlet.ServletRequest,javax.servlet.ServletResponse)>(r1, r2)
09:40:12.596 [main] INFO auth.jarInflow.JarAuthInfoflow - -> <org.apache.catalina.core.ApplicationFilterChain: void internalDoFilter(javax.servlet.ServletRequest,javax.servlet.ServletResponse)>
09:40:12.596 [main] INFO auth.jarInflow.JarAuthInfoflow - -> interfaceinvoke r35.<javax.servlet.Filter: void doFilter(javax.servlet.ServletRequest,javax.servlet.ServletResponse,javax.servlet.FilterChain)>(r1, r2, r0)
09:40:12.596 [main] INFO auth.jarInflow.JarAuthInfoflow - -> <BOOT-INF.classes.com.jsh.erp.filter.LogCostFilter: void doFilter(javax.servlet.ServletRequest,javax.servlet.ServletResponse,javax.servlet.FilterChain)>
09:40:12.596 [main] INFO auth.jarInflow.JarAuthInfoflow - -> interfaceinvoke r13.<javax.servlet.FilterChain: void doFilter(javax.servlet.ServletRequest,javax.servlet.ServletResponse)>(r0, r2)
09:40:12.596 [main] INFO auth.jarInflow.JarAuthInfoflow - -> <org.apache.catalina.core.ApplicationFilterChain: void doFilter(javax.servlet.ServletRequest,javax.servlet.ServletResponse)>
09:40:12.596 [main] INFO auth.jarInflow.JarAuthInfoflow - -> specialinvoke $r3.<org.apache.catalina.core.ApplicationFilterChain$1: void (org.apache.catalina.core.ApplicationFilterChain,javax.servlet.ServletRequest,javax.servlet.ServletResponse)>(r0, r1, r2)
09:40:12.596 [main] INFO auth.jarInflow.JarAuthInfoflow - -> <org.apache.catalina.core.ApplicationFilterChain$1: void (org.apache.catalina.core.ApplicationFilterChain,javax.servlet.ServletRequest,javax.servlet.ServletResponse)>
09:40:12.596 [main] INFO auth.jarInflow.JarAuthInfoflow - -> return
09:40:12.596 [main] INFO auth.jarInflow.JarAuthInfoflow - -> <org.apache.catalina.core.ApplicationFilterChain: void doFilter(javax.servlet.ServletRequest,javax.servlet.ServletResponse)>
09:40:12.596 [main] INFO auth.jarInflow.JarAuthInfoflow - -> specialinvoke r0.<org.apache.catalina.core.ApplicationFilterChain: void internalDoFilter(javax.servlet.ServletRequest,javax.servlet.ServletResponse)>(r1, r2)
09:40:12.596 [main] INFO auth.jarInflow.JarAuthInfoflow - -> <org.apache.catalina.core.ApplicationFilterChain: void internalDoFilter(javax.servlet.ServletRequest,javax.servlet.ServletResponse)>
09:40:12.596 [main] INFO auth.jarInflow.JarAuthInfoflow - -> interfaceinvoke $r38.<javax.servlet.Servlet: void service(javax.servlet.ServletRequest,javax.servlet.ServletResponse)>(r1, r2)
09:40:12.596 [main] INFO auth.jarInflow.JarAuthInfoflow - Data flow solver took 5 seconds. Maximum memory consumption: 1233 MB
09:40:12.597 [main] INFO SetupApplication - Found 1 leaks from 9 sources

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions