Points-to sets of all variables
[]:<SourceSink: java.lang.String source()>/temp$0 -> [[]:MergedObj{<Merged java.lang.String>}]
[]:<SourceSink: void sink(java.lang.String)>/s -> [[]:TaintObj{alloc=<StringAppend: void stringAdd()>[0@L10] temp$0 = invokestatic SourceSink.source()/result,type=java.lang.String}, []:TaintObj{alloc=<StringAppend: void stringBuffer()>[0@L16] temp$0 = invokestatic SourceSink.source()/result,type=java.lang.String}, []:TaintObj{alloc=<StringAppend: void stringBuilder()>[0@L26] temp$0 = invokestatic SourceSink.source()/result,type=java.lang.String}]
[]:<StringAppend: void main(java.lang.String[])>/args -> [[]:EntryPointObj{alloc=MethodParam{<StringAppend: void main(java.lang.String[])>/0},type=java.lang.String[] in <StringAppend: void main(java.lang.String[])>}]
[]:<StringAppend: void stringAdd()>/%stringconst0 -> [[]:MergedObj{<Merged string constants>}]
[]:<StringAppend: void stringAdd()>/%stringconst1 -> [[]:MergedObj{<Merged string constants>}]
[]:<StringAppend: void stringAdd()>/s -> [[]:TaintObj{alloc=<StringAppend: void stringAdd()>[0@L10] temp$0 = invokestatic SourceSink.source()/result,type=java.lang.String}]
[]:<StringAppend: void stringAdd()>/taint -> [[]:MergedObj{<Merged java.lang.String>}, []:TaintObj{alloc=<StringAppend: void stringAdd()>[0@L10] temp$0 = invokestatic SourceSink.source()/result,type=java.lang.String}]
[]:<StringAppend: void stringAdd()>/temp$0 -> [[]:MergedObj{<Merged java.lang.String>}, []:TaintObj{alloc=<StringAppend: void stringAdd()>[0@L10] temp$0 = invokestatic SourceSink.source()/result,type=java.lang.String}]
[]:<StringAppend: void stringAdd()>/temp$1 -> [[]:MergedObj{<Merged java.lang.StringBuffer>}, []:TaintObj{alloc=<StringAppend: void stringAdd()>[0@L10] temp$0 = invokestatic SourceSink.source()/result,type=java.lang.StringBuffer}]
[]:<StringAppend: void stringAdd()>/temp$2 -> [[]:TaintObj{alloc=<StringAppend: void stringAdd()>[0@L10] temp$0 = invokestatic SourceSink.source()/result,type=java.lang.String}]
[]:<StringAppend: void stringBuffer()>/%stringconst0 -> [[]:MergedObj{<Merged string constants>}]
[]:<StringAppend: void stringBuffer()>/%stringconst1 -> [[]:MergedObj{<Merged string constants>}]
[]:<StringAppend: void stringBuffer()>/s -> [[]:TaintObj{alloc=<StringAppend: void stringBuffer()>[0@L16] temp$0 = invokestatic SourceSink.source()/result,type=java.lang.String}]
[]:<StringAppend: void stringBuffer()>/sb -> [[]:MergedObj{<Merged java.lang.StringBuffer>}, []:TaintObj{alloc=<StringAppend: void stringBuffer()>[0@L16] temp$0 = invokestatic SourceSink.source()/result,type=java.lang.StringBuffer}]
[]:<StringAppend: void stringBuffer()>/taint -> [[]:MergedObj{<Merged java.lang.String>}, []:TaintObj{alloc=<StringAppend: void stringBuffer()>[0@L16] temp$0 = invokestatic SourceSink.source()/result,type=java.lang.String}]
[]:<StringAppend: void stringBuffer()>/temp$0 -> [[]:MergedObj{<Merged java.lang.String>}, []:TaintObj{alloc=<StringAppend: void stringBuffer()>[0@L16] temp$0 = invokestatic SourceSink.source()/result,type=java.lang.String}]
[]:<StringAppend: void stringBuffer()>/temp$1 -> [[]:MergedObj{<Merged java.lang.StringBuffer>}]
[]:<StringAppend: void stringBuffer()>/temp$5 -> [[]:TaintObj{alloc=<StringAppend: void stringBuffer()>[0@L16] temp$0 = invokestatic SourceSink.source()/result,type=java.lang.String}]
[]:<StringAppend: void stringBuilder()>/%stringconst0 -> [[]:MergedObj{<Merged string constants>}]
[]:<StringAppend: void stringBuilder()>/%stringconst1 -> [[]:MergedObj{<Merged string constants>}]
[]:<StringAppend: void stringBuilder()>/s -> [[]:TaintObj{alloc=<StringAppend: void stringBuilder()>[0@L26] temp$0 = invokestatic SourceSink.source()/result,type=java.lang.String}]
[]:<StringAppend: void stringBuilder()>/sb -> [[]:MergedObj{<Merged java.lang.StringBuilder>}, []:TaintObj{alloc=<StringAppend: void stringBuilder()>[0@L26] temp$0 = invokestatic SourceSink.source()/result,type=java.lang.StringBuilder}]
[]:<StringAppend: void stringBuilder()>/taint -> [[]:MergedObj{<Merged java.lang.String>}, []:TaintObj{alloc=<StringAppend: void stringBuilder()>[0@L26] temp$0 = invokestatic SourceSink.source()/result,type=java.lang.String}]
[]:<StringAppend: void stringBuilder()>/temp$0 -> [[]:MergedObj{<Merged java.lang.String>}, []:TaintObj{alloc=<StringAppend: void stringBuilder()>[0@L26] temp$0 = invokestatic SourceSink.source()/result,type=java.lang.String}]
[]:<StringAppend: void stringBuilder()>/temp$1 -> [[]:MergedObj{<Merged java.lang.StringBuilder>}]
[]:<StringAppend: void stringBuilder()>/temp$5 -> [[]:TaintObj{alloc=<StringAppend: void stringBuilder()>[0@L26] temp$0 = 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{<StringAppend: void main(java.lang.String[])>/0},type=java.lang.String[] in <StringAppend: void main(java.lang.String[])>}[*] -> [[]:EntryPointObj{alloc=MethodParam{<StringAppend: void main(java.lang.String[])>/0}[*],type=java.lang.String in <StringAppend: void main(java.lang.String[])>}]

Detected 3 taint flow(s):
TaintFlow{<StringAppend: void stringAdd()>[0@L10] temp$0 = invokestatic SourceSink.source()/result -> <StringAppend: void stringAdd()>[11@L12] invokestatic SourceSink.sink(s)/0}
TaintFlow{<StringAppend: void stringBuffer()>[0@L16] temp$0 = invokestatic SourceSink.source()/result -> <StringAppend: void stringBuffer()>[12@L22] invokestatic SourceSink.sink(s)/0}
TaintFlow{<StringAppend: void stringBuilder()>[0@L26] temp$0 = invokestatic SourceSink.source()/result -> <StringAppend: void stringBuilder()>[12@L32] invokestatic SourceSink.sink(s)/0}

