- Notifications
You must be signed in to change notification settings - Fork 310
Open
Description
When calling sink multiple times, how can I distinguish the source of each call in the result report?
When the source code is as follows, I will find 2 leaks, just as I expected
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val s1 = source1(); val s2 = source2(); val s3 = source3(); val s4 = source4(); sink(s1+s2) sink(s3+s4) }
<Results> <Result> <Sink Statement="specialinvoke r0.<com.example.myapplication.MainActivity: void sink(java.lang.String)>($r2)" Method="<com.example.myapplication.MainActivity: void onCreate(android.os.Bundle)>" MethodSourceSinkDefinition="<com.example.myapplication.MainActivity: void sink(java.lang.String)>"> <AccessPath Value="$r2" Type="java.lang.String" TaintSubFields="true"/> </Sink> <Sources> <Source Statement="$r2 = specialinvoke r0.<com.example.myapplication.MainActivity: java.lang.String source1()>()" Method="<com.example.myapplication.MainActivity: void onCreate(android.os.Bundle)>" MethodSourceSinkDefinition="<com.example.myapplication.MainActivity: java.lang.String source1()>"> <AccessPath Value="$r2" Type="java.lang.String" TaintSubFields="true"/> </Source> <Source Statement="$r3 = specialinvoke r0.<com.example.myapplication.MainActivity: java.lang.String source2()>()" Method="<com.example.myapplication.MainActivity: void onCreate(android.os.Bundle)>" MethodSourceSinkDefinition="<com.example.myapplication.MainActivity: java.lang.String source2()>"> <AccessPath Value="$r3" Type="java.lang.String" TaintSubFields="true"/> </Source> </Sources> </Result> <Result> <Sink Statement="specialinvoke r0.<com.example.myapplication.MainActivity: void sink(java.lang.String)>($r4)" Method="<com.example.myapplication.MainActivity: void onCreate(android.os.Bundle)>" MethodSourceSinkDefinition="<com.example.myapplication.MainActivity: void sink(java.lang.String)>"> <AccessPath Value="$r4" Type="java.lang.String" TaintSubFields="true"/> </Sink> <Sources> <Source Statement="$r5 = specialinvoke r0.<com.example.myapplication.MainActivity: java.lang.String source4()>()" Method="<com.example.myapplication.MainActivity: void onCreate(android.os.Bundle)>" MethodSourceSinkDefinition="<com.example.myapplication.MainActivity: java.lang.String source4()>"> <AccessPath Value="$r5" Type="java.lang.String" TaintSubFields="true"/> </Source> <Source Statement="$r4 = specialinvoke r0.<com.example.myapplication.MainActivity: java.lang.String source3()>()" Method="<com.example.myapplication.MainActivity: void onCreate(android.os.Bundle)>" MethodSourceSinkDefinition="<com.example.myapplication.MainActivity: java.lang.String source3()>"> <AccessPath Value="$r4" Type="java.lang.String" TaintSubFields="true"/> </Source> </Sources> </Result> </Results>
If I call sink in outersink, I will only find one leak, and I cannot directly distinguish which sources are used each time the sink is called.
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val s1 = source1(); val s2 = source2(); val s3 = source3(); val s4 = source4(); outersink(s1+s2) outersink(s3+s4) }
<Result> <Sink Statement="specialinvoke r0.<com.example.myapplication.MainActivity: void sink(java.lang.String)>($r1)" Method="<com.example.myapplication.MainActivity: void outersink(java.lang.String)>" MethodSourceSinkDefinition="<com.example.myapplication.MainActivity: void sink(java.lang.String)>"> <AccessPath Value="$r1" Type="java.lang.String" TaintSubFields="true"/> </Sink> <Sources> <Source Statement="$r5 = specialinvoke r0.<com.example.myapplication.MainActivity: java.lang.String source4()>()" Method="<com.example.myapplication.MainActivity: void onCreate(android.os.Bundle)>" MethodSourceSinkDefinition="<com.example.myapplication.MainActivity: java.lang.String source4()>"> <AccessPath Value="$r5" Type="java.lang.String" TaintSubFields="true"/> </Source> <Source Statement="$r2 = specialinvoke r0.<com.example.myapplication.MainActivity: java.lang.String source1()>()" Method="<com.example.myapplication.MainActivity: void onCreate(android.os.Bundle)>" MethodSourceSinkDefinition="<com.example.myapplication.MainActivity: java.lang.String source1()>"> <AccessPath Value="$r2" Type="java.lang.String" TaintSubFields="true"/> </Source> <Source Statement="$r3 = specialinvoke r0.<com.example.myapplication.MainActivity: java.lang.String source2()>()" Method="<com.example.myapplication.MainActivity: void onCreate(android.os.Bundle)>" MethodSourceSinkDefinition="<com.example.myapplication.MainActivity: java.lang.String source2()>"> <AccessPath Value="$r3" Type="java.lang.String" TaintSubFields="true"/> </Source> <Source Statement="$r4 = specialinvoke r0.<com.example.myapplication.MainActivity: java.lang.String source3()>()" Method="<com.example.myapplication.MainActivity: void onCreate(android.os.Bundle)>" MethodSourceSinkDefinition="<com.example.myapplication.MainActivity: java.lang.String source3()>"> <AccessPath Value="$r4" Type="java.lang.String" TaintSubFields="true"/> </Source> </Sources> </Result>
Is there a way I can distinguish the sources that flow to the sink each time? Thank you for your time.
Metadata
Metadata
Assignees
Labels
No labels