1+ import org .apache .commons .text .StrBuilder ;
2+ import org .apache .commons .text .StrMatcher ;
3+ import org .apache .commons .text .StrTokenizer ;
4+ import java .io .StringReader ;
5+ import java .nio .CharBuffer ;
6+ import java .util .ArrayList ;
7+ import java .util .List ;
8+ import java .util .Locale ;
9+
10+ class StrBuilderTextTest {
11+ String taint () { return "tainted" ; }
12+
13+ void sink (Object o ) {}
14+
15+ void test () throws Exception {
16+
17+ StrBuilder sb1 = new StrBuilder (); sb1 .append (taint ().toCharArray ()); sink (sb1 .toString ()); // $hasTaintFlow=y
18+ StrBuilder sb2 = new StrBuilder (); sb2 .append (taint ().toCharArray (), 0 , 0 ); sink (sb2 .toString ()); // $hasTaintFlow=y
19+ StrBuilder sb3 = new StrBuilder (); sb3 .append (CharBuffer .wrap (taint ().toCharArray ())); sink (sb3 .toString ()); // BAD (but not detected because we don't model CharBuffer yet)
20+ StrBuilder sb4 = new StrBuilder (); sb4 .append (CharBuffer .wrap (taint ().toCharArray ()), 0 , 0 ); sink (sb4 .toString ()); // BAD (but not detected because we don't model CharBuffer yet)
21+ StrBuilder sb5 = new StrBuilder (); sb5 .append ((CharSequence )taint ()); sink (sb5 .toString ()); // $hasTaintFlow=y
22+ StrBuilder sb6 = new StrBuilder (); sb6 .append ((CharSequence )taint (), 0 , 0 ); sink (sb6 .toString ()); // $hasTaintFlow=y
23+ StrBuilder sb7 = new StrBuilder (); sb7 .append ((Object )taint ()); sink (sb7 .toString ()); // $hasTaintFlow=y
24+ {
25+ StrBuilder auxsb = new StrBuilder (); auxsb .append (taint ());
26+ StrBuilder sb8 = new StrBuilder (); sb8 .append (auxsb ); sink (sb8 .toString ()); // $hasTaintFlow=y
27+ }
28+ StrBuilder sb9 = new StrBuilder (); sb9 .append (new StringBuffer (taint ())); sink (sb9 .toString ()); // $hasTaintFlow=y
29+ StrBuilder sb10 = new StrBuilder (); sb10 .append (new StringBuffer (taint ()), 0 , 0 ); sink (sb10 .toString ()); // $hasTaintFlow=y
30+ StrBuilder sb11 = new StrBuilder (); sb11 .append (new StringBuilder (taint ())); sink (sb11 .toString ()); // $hasTaintFlow=y
31+ StrBuilder sb12 = new StrBuilder (); sb12 .append (new StringBuilder (taint ()), 0 , 0 ); sink (sb12 .toString ()); // $hasTaintFlow=y
32+ StrBuilder sb13 = new StrBuilder (); sb13 .append (taint ()); sink (sb13 .toString ()); // $hasTaintFlow=y
33+ StrBuilder sb14 = new StrBuilder (); sb14 .append (taint (), 0 , 0 ); sink (sb14 .toString ()); // $hasTaintFlow=y
34+ StrBuilder sb15 = new StrBuilder (); sb15 .append (taint (), "format" , "args" ); sink (sb15 .toString ()); // $hasTaintFlow=y
35+ StrBuilder sb16 = new StrBuilder (); sb16 .append ("Format string" , taint (), "args" ); sink (sb16 .toString ()); // $hasTaintFlow=y
36+ {
37+ List <String > taintedList = new ArrayList <>();
38+ taintedList .add (taint ());
39+ StrBuilder sb17 = new StrBuilder (); sb17 .appendAll (taintedList ); sink (sb17 .toString ()); // $hasTaintFlow=y
40+ StrBuilder sb18 = new StrBuilder (); sb18 .appendAll (taintedList .iterator ()); sink (sb18 .toString ()); // $hasTaintFlow=y
41+ }
42+ StrBuilder sb19 = new StrBuilder (); sb19 .appendAll ("clean" , taint ()); sink (sb19 .toString ()); // $hasTaintFlow=y
43+ StrBuilder sb20 = new StrBuilder (); sb20 .appendAll (taint (), "clean" ); sink (sb20 .toString ()); // $hasTaintFlow=y
44+ StrBuilder sb21 = new StrBuilder (); sb21 .appendFixedWidthPadLeft (taint (), 0 , ' ' ); sink (sb21 .toString ()); // $hasTaintFlow=y
45+ StrBuilder sb22 = new StrBuilder (); sb22 .appendFixedWidthPadRight (taint (), 0 , ' ' ); sink (sb22 .toString ()); // $hasTaintFlow=y
46+ StrBuilder sb23 = new StrBuilder (); sb23 .appendln (taint ().toCharArray ()); sink (sb23 .toString ()); // $hasTaintFlow=y
47+ StrBuilder sb24 = new StrBuilder (); sb24 .appendln (taint ().toCharArray (), 0 , 0 ); sink (sb24 .toString ()); // $hasTaintFlow=y
48+ StrBuilder sb25 = new StrBuilder (); sb25 .appendln ((Object )taint ()); sink (sb25 .toString ()); // $hasTaintFlow=y
49+ {
50+ StrBuilder auxsb = new StrBuilder (); auxsb .appendln (taint ());
51+ StrBuilder sb26 = new StrBuilder (); sb26 .appendln (auxsb ); sink (sb26 .toString ()); // $hasTaintFlow=y
52+ }
53+ StrBuilder sb27 = new StrBuilder (); sb27 .appendln (new StringBuffer (taint ())); sink (sb27 .toString ()); // $hasTaintFlow=y
54+ StrBuilder sb28 = new StrBuilder (); sb28 .appendln (new StringBuffer (taint ()), 0 , 0 ); sink (sb28 .toString ()); // $hasTaintFlow=y
55+ StrBuilder sb29 = new StrBuilder (); sb29 .appendln (new StringBuilder (taint ())); sink (sb29 .toString ()); // $hasTaintFlow=y
56+ StrBuilder sb30 = new StrBuilder (); sb30 .appendln (new StringBuilder (taint ()), 0 , 0 ); sink (sb30 .toString ()); // $hasTaintFlow=y
57+ StrBuilder sb31 = new StrBuilder (); sb31 .appendln (taint ()); sink (sb31 .toString ()); // $hasTaintFlow=y
58+ StrBuilder sb32 = new StrBuilder (); sb32 .appendln (taint (), 0 , 0 ); sink (sb32 .toString ()); // $hasTaintFlow=y
59+ StrBuilder sb33 = new StrBuilder (); sb33 .appendln (taint (), "format" , "args" ); sink (sb33 .toString ()); // $hasTaintFlow=y
60+ StrBuilder sb34 = new StrBuilder (); sb34 .appendln ("Format string" , taint (), "args" ); sink (sb34 .toString ()); // $hasTaintFlow=y
61+ StrBuilder sb35 = new StrBuilder (); sb35 .appendSeparator (taint ()); sink (sb35 .toString ()); // $hasTaintFlow=y
62+ StrBuilder sb36 = new StrBuilder (); sb36 .appendSeparator (taint (), 0 ); sink (sb36 .toString ()); // $hasTaintFlow=y
63+ StrBuilder sb37 = new StrBuilder (); sb37 .appendSeparator (taint (), "default" ); sink (sb37 .toString ()); // $hasTaintFlow=y
64+ StrBuilder sb38 = new StrBuilder (); sb38 .appendSeparator ("" , taint ()); sink (sb38 .toString ()); // $hasTaintFlow=y
65+ {
66+ StrBuilder auxsb = new StrBuilder (); auxsb .appendln (taint ());
67+ StrBuilder sb39 = new StrBuilder (); auxsb .appendTo (sb39 ); sink (sb39 .toString ()); // $hasTaintFlow=y
68+ }
69+ {
70+ List <String > taintedList = new ArrayList <>();
71+ taintedList .add (taint ());
72+ StrBuilder sb40 = new StrBuilder (); sb40 .appendWithSeparators (taintedList , ", " ); sink (sb40 .toString ()); // $hasTaintFlow=y
73+ StrBuilder sb41 = new StrBuilder (); sb41 .appendWithSeparators (taintedList .iterator (), ", " ); sink (sb41 .toString ()); // $hasTaintFlow=y
74+ List <String > untaintedList = new ArrayList <>();
75+ StrBuilder sb42 = new StrBuilder (); sb42 .appendWithSeparators (untaintedList , taint ()); sink (sb42 .toString ()); // $hasTaintFlow=y
76+ StrBuilder sb43 = new StrBuilder (); sb43 .appendWithSeparators (untaintedList .iterator (), taint ()); sink (sb43 .toString ()); // $hasTaintFlow=y
77+ String [] taintedArray = new String [] { taint () };
78+ String [] untaintedArray = new String [] {};
79+ StrBuilder sb44 = new StrBuilder (); sb44 .appendWithSeparators (taintedArray , ", " ); sink (sb44 .toString ()); // $hasTaintFlow=y
80+ StrBuilder sb45 = new StrBuilder (); sb45 .appendWithSeparators (untaintedArray , taint ()); sink (sb45 .toString ()); // $hasTaintFlow=y
81+ }
82+ {
83+ StrBuilder sb46 = new StrBuilder (); sb46 .append (taint ());
84+ char [] target = new char [100 ];
85+ sb46 .asReader ().read (target );
86+ sink (target ); // $hasTaintFlow=y
87+ }
88+ StrBuilder sb47 = new StrBuilder (); sb47 .append (taint ()); sink (sb47 .asTokenizer ().next ()); // $hasTaintFlow=y
89+ StrBuilder sb48 = new StrBuilder (); sb48 .append (taint ()); sink (sb48 .build ()); // $hasTaintFlow=y
90+ StrBuilder sb49 = new StrBuilder (); sb49 .append (taint ()); sink (sb49 .getChars (null )); // $hasTaintFlow=y
91+ {
92+ StrBuilder sb50 = new StrBuilder (); sb50 .append (taint ());
93+ char [] target = new char [100 ];
94+ sb50 .getChars (target );
95+ sink (target ); // $hasTaintFlow=y
96+ }
97+ {
98+ StrBuilder sb51 = new StrBuilder (); sb51 .append (taint ());
99+ char [] target = new char [100 ];
100+ sb51 .getChars (0 , 0 , target , 0 );
101+ sink (target ); // $hasTaintFlow=y
102+ }
103+ StrBuilder sb52 = new StrBuilder (); sb52 .insert (0 , taint ().toCharArray ()); sink (sb52 .toString ()); // $hasTaintFlow=y
104+ StrBuilder sb53 = new StrBuilder (); sb53 .insert (0 , taint ().toCharArray (), 0 , 0 ); sink (sb53 .toString ()); // $hasTaintFlow=y
105+ StrBuilder sb54 = new StrBuilder (); sb54 .insert (0 , taint ()); sink (sb54 .toString ()); // $hasTaintFlow=y
106+ StrBuilder sb55 = new StrBuilder (); sb55 .insert (0 , (Object )taint ()); sink (sb55 .toString ()); // $hasTaintFlow=y
107+ StrBuilder sb56 = new StrBuilder (); sb56 .append (taint ()); sink (sb56 .leftString (0 )); // $hasTaintFlow=y
108+ StrBuilder sb57 = new StrBuilder (); sb57 .append (taint ()); sink (sb57 .midString (0 , 0 )); // $hasTaintFlow=y
109+ {
110+ StringReader reader = new StringReader (taint ());
111+ StrBuilder sb58 = new StrBuilder (); sb58 .readFrom (reader ); sink (sb58 .toString ()); // $hasTaintFlow=y
112+ }
113+ StrBuilder sb59 = new StrBuilder (); sb59 .replace (0 , 0 , taint ()); sink (sb59 .toString ()); // $hasTaintFlow=y
114+ StrBuilder sb60 = new StrBuilder (); sb60 .replace (null , taint (), 0 , 0 , 0 ); sink (sb60 .toString ()); // $hasTaintFlow=y
115+ StrBuilder sb61 = new StrBuilder (); sb61 .replaceAll ((StrMatcher )null , taint ()); sink (sb61 .toString ()); // $hasTaintFlow=y
116+ StrBuilder sb62 = new StrBuilder (); sb62 .replaceAll ("search" , taint ()); sink (sb62 .toString ()); // $hasTaintFlow=y
117+ StrBuilder sb63 = new StrBuilder (); sb63 .replaceAll (taint (), "replace" ); sink (sb63 .toString ()); // GOOD (search string doesn't convey taint)
118+ StrBuilder sb64 = new StrBuilder (); sb64 .replaceFirst ((StrMatcher )null , taint ()); sink (sb64 .toString ()); // $hasTaintFlow=y
119+ StrBuilder sb65 = new StrBuilder (); sb65 .replaceFirst ("search" , taint ()); sink (sb65 .toString ()); // $hasTaintFlow=y
120+ StrBuilder sb66 = new StrBuilder (); sb66 .replaceFirst (taint (), "replace" ); sink (sb66 .toString ()); // GOOD (search string doesn't convey taint)
121+ StrBuilder sb67 = new StrBuilder (); sb67 .append (taint ()); sink (sb67 .rightString (0 )); // $hasTaintFlow=y
122+ StrBuilder sb68 = new StrBuilder (); sb68 .append (taint ()); sink (sb68 .subSequence (0 , 0 )); // $hasTaintFlow=y
123+ StrBuilder sb69 = new StrBuilder (); sb69 .append (taint ()); sink (sb69 .substring (0 )); // $hasTaintFlow=y
124+ StrBuilder sb70 = new StrBuilder (); sb70 .append (taint ()); sink (sb70 .substring (0 , 0 )); // $hasTaintFlow=y
125+ StrBuilder sb71 = new StrBuilder (); sb71 .append (taint ()); sink (sb71 .toCharArray ()); // $hasTaintFlow=y
126+ StrBuilder sb72 = new StrBuilder (); sb72 .append (taint ()); sink (sb72 .toCharArray (0 , 0 )); // $hasTaintFlow=y
127+ StrBuilder sb73 = new StrBuilder (); sb73 .append (taint ()); sink (sb73 .toStringBuffer ()); // $hasTaintFlow=y
128+ StrBuilder sb74 = new StrBuilder (); sb74 .append (taint ()); sink (sb74 .toStringBuilder ()); // $hasTaintFlow=y
129+ }
130+
131+ }
0 commit comments