Points-to sets of all variables
[]:<ArrayTaint: java.lang.String join(java.lang.String,java.lang.String[])>/delim -> [[]:MergedObj{<Merged string constants>}]
[]:<ArrayTaint: java.lang.String join(java.lang.String,java.lang.String[])>/sb -> [[]:MergedObj{<Merged java.lang.StringBuilder>}, []:TaintObj{alloc=<ArrayTaint: void main(java.lang.String[])>[8@L5] temp$3 = invokestatic SourceSink.source()/result,type=java.lang.StringBuilder}]
[]:<ArrayTaint: java.lang.String join(java.lang.String,java.lang.String[])>/strings -> [[]:NewObj{<ArrayTaint: void main(java.lang.String[])>[1@L3] newarray java.lang.String[%intconst0]}]
[]:<ArrayTaint: java.lang.String join(java.lang.String,java.lang.String[])>/temp$1 -> [[]:MergedObj{<Merged string constants>}]
[]:<ArrayTaint: java.lang.String join(java.lang.String,java.lang.String[])>/temp$16 -> [[]:MergedObj{<Merged java.lang.String>}, []:TaintObj{alloc=<ArrayTaint: void main(java.lang.String[])>[8@L5] temp$3 = invokestatic SourceSink.source()/result,type=java.lang.String}]
[]:<ArrayTaint: java.lang.String join(java.lang.String,java.lang.String[])>/temp$18 -> [[]:TaintObj{alloc=<ArrayTaint: void main(java.lang.String[])>[8@L5] temp$3 = invokestatic SourceSink.source()/result,type=java.lang.String}]
[]:<ArrayTaint: java.lang.String join(java.lang.String,java.lang.String[])>/temp$2 -> [[]:MergedObj{<Merged java.lang.StringBuilder>}]
[]:<ArrayTaint: java.lang.String join(java.lang.String,java.lang.String[])>/temp$7 -> [[]:MergedObj{<Merged java.lang.String>}, []:TaintObj{alloc=<ArrayTaint: void main(java.lang.String[])>[8@L5] temp$3 = invokestatic SourceSink.source()/result,type=java.lang.String}]
[]:<ArrayTaint: void main(java.lang.String[])>/%stringconst2 -> [[]:MergedObj{<Merged string constants>}]
[]:<ArrayTaint: void main(java.lang.String[])>/args -> [[]:EntryPointObj{alloc=MethodParam{<ArrayTaint: void main(java.lang.String[])>/0},type=java.lang.String[] in <ArrayTaint: void main(java.lang.String[])>}]
[]:<ArrayTaint: void main(java.lang.String[])>/arr -> [[]:NewObj{<ArrayTaint: void main(java.lang.String[])>[1@L3] newarray java.lang.String[%intconst0]}]
[]:<ArrayTaint: void main(java.lang.String[])>/temp$3 -> [[]:MergedObj{<Merged java.lang.String>}, []:TaintObj{alloc=<ArrayTaint: void main(java.lang.String[])>[8@L5] temp$3 = invokestatic SourceSink.source()/result,type=java.lang.String}]
[]:<ArrayTaint: void main(java.lang.String[])>/temp$6 -> [[]:MergedObj{<Merged string constants>}, []:TaintObj{alloc=<ArrayTaint: void main(java.lang.String[])>[8@L5] temp$3 = invokestatic SourceSink.source()/result,type=java.lang.String}]
[]:<SourceSink: java.lang.String source()>/temp$0 -> [[]:MergedObj{<Merged java.lang.String>}]
[]:<SourceSink: void sink(java.lang.String)>/s -> [[]:MergedObj{<Merged string constants>}, []:TaintObj{alloc=<ArrayTaint: void main(java.lang.String[])>[8@L5] temp$3 = invokestatic SourceSink.source()/result,type=java.lang.String}]

Points-to sets of all static fields

Points-to sets of all instance fields

Points-to sets of all array indexes
[]:EntryPointObj{alloc=MethodParam{<ArrayTaint: void main(java.lang.String[])>/0},type=java.lang.String[] in <ArrayTaint: void main(java.lang.String[])>}[*] -> [[]:EntryPointObj{alloc=MethodParam{<ArrayTaint: void main(java.lang.String[])>/0}[*],type=java.lang.String in <ArrayTaint: void main(java.lang.String[])>}]
[]:NewObj{<ArrayTaint: void main(java.lang.String[])>[1@L3] newarray java.lang.String[%intconst0]}[*] -> [[]:MergedObj{<Merged java.lang.String>}, []:TaintObj{alloc=<ArrayTaint: void main(java.lang.String[])>[8@L5] temp$3 = invokestatic SourceSink.source()/result,type=java.lang.String}]

Detected 1 taint flow(s):
TaintFlow{<ArrayTaint: void main(java.lang.String[])>[8@L5] temp$3 = invokestatic SourceSink.source()/result -> <ArrayTaint: void main(java.lang.String[])>[17@L7] invokestatic SourceSink.sink(temp$6)/0}

