Skip to content

Commit 9e61dfb

Browse files
committed
C#: Convert System.Text.StringBuilder flow to CSV format.
1 parent 5a26346 commit 9e61dfb

File tree

2 files changed

+92
-63
lines changed

2 files changed

+92
-63
lines changed

csharp/ql/lib/semmle/code/csharp/dataflow/LibraryTypeDataFlow.qll

Lines changed: 0 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -537,69 +537,6 @@ class SystemIOStringReaderFlow extends LibraryTypeDataFlow, SystemIOStringReader
537537

538538
/** Data flow for `System.Text.StringBuilder`. */
539539
class SystemTextStringBuilderFlow extends LibraryTypeDataFlow, SystemTextStringBuilderClass {
540-
override predicate callableFlow(
541-
CallableFlowSource source, AccessPath sourceAp, CallableFlowSink sink, AccessPath sinkAp,
542-
SourceDeclarationCallable c, boolean preservesValue
543-
) {
544-
(
545-
this.constructorFlow(source, sourceAp, sink, sinkAp, c) and
546-
preservesValue = true
547-
or
548-
this.methodFlow(source, sourceAp, sink, sinkAp, c, preservesValue)
549-
)
550-
}
551-
552-
private predicate constructorFlow(
553-
CallableFlowSource source, AccessPath sourceAp, CallableFlowSink sink, AccessPath sinkAp,
554-
Constructor c
555-
) {
556-
c = this.getAMember() and
557-
c.getParameter(0).getType() instanceof StringType and
558-
source = TCallableFlowSourceArg(0) and
559-
sourceAp = AccessPath::empty() and
560-
sink = TCallableFlowSinkReturn() and
561-
sinkAp = AccessPath::element()
562-
}
563-
564-
private predicate methodFlow(
565-
CallableFlowSource source, AccessPath sourceAp, CallableFlowSink sink, AccessPath sinkAp,
566-
SourceDeclarationMethod m, boolean preservesValue
567-
) {
568-
exists(string name | m = this.getAMethod() and m.hasUndecoratedName(name) |
569-
name = "ToString" and
570-
source = TCallableFlowSourceQualifier() and
571-
sourceAp = AccessPath::element() and
572-
sink = TCallableFlowSinkReturn() and
573-
sinkAp = AccessPath::empty() and
574-
preservesValue = false
575-
or
576-
name.regexpMatch("Append(Format|Line|Join)?") and
577-
preservesValue = true and
578-
(
579-
exists(int i, Type t |
580-
t = m.getParameter(i).getType() and
581-
source = TCallableFlowSourceArg(i) and
582-
sink = TCallableFlowSinkQualifier() and
583-
sinkAp = AccessPath::element()
584-
|
585-
(
586-
t instanceof StringType or
587-
t instanceof ObjectType
588-
) and
589-
sourceAp = AccessPath::empty()
590-
or
591-
isCollectionType(t) and
592-
sourceAp = AccessPath::element()
593-
)
594-
or
595-
source = TCallableFlowSourceQualifier() and
596-
sourceAp = AccessPath::empty() and
597-
sink = TCallableFlowSinkReturn() and
598-
sinkAp = AccessPath::empty()
599-
)
600-
)
601-
}
602-
603540
override predicate clearsContent(
604541
CallableFlowSource source, Content content, SourceDeclarationCallable callable
605542
) {

csharp/ql/lib/semmle/code/csharp/frameworks/system/Text.qll

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import csharp
44
private import semmle.code.csharp.frameworks.System
5+
private import semmle.code.csharp.dataflow.ExternalFlow
56

67
/** The `System.Text` namespace. */
78
class SystemTextNamespace extends Namespace {
@@ -24,6 +25,97 @@ class SystemTextStringBuilderClass extends SystemTextClass {
2425
Method getAppendFormatMethod() { result = this.getAMethod("AppendFormat") }
2526
}
2627

28+
/** Data flow for `System.Text.StringBuilder`. */
29+
private class SystemTextStringBuilderFlowModelCsv extends SummaryModelCsv {
30+
override predicate row(string row) {
31+
row =
32+
[
33+
"System.Text;StringBuilder;false;Append;(System.Boolean);;Argument[-1];ReturnValue;value",
34+
"System.Text;StringBuilder;false;Append;(System.Byte);;Argument[-1];ReturnValue;value",
35+
"System.Text;StringBuilder;false;Append;(System.Char);;Argument[-1];ReturnValue;value",
36+
"System.Text;StringBuilder;false;Append;(System.Char*,System.Int32);;Argument[-1];ReturnValue;value",
37+
"System.Text;StringBuilder;false;Append;(System.Char,System.Int32);;Argument[-1];ReturnValue;value",
38+
"System.Text;StringBuilder;false;Append;(System.Char[]);;Argument[-1];ReturnValue;value",
39+
"System.Text;StringBuilder;false;Append;(System.Char[]);;Element of Argument[0];Element of Argument[-1];value",
40+
"System.Text;StringBuilder;false;Append;(System.Char[],System.Int32,System.Int32);;Argument[-1];ReturnValue;value",
41+
"System.Text;StringBuilder;false;Append;(System.Char[],System.Int32,System.Int32);;Element of Argument[0];Element of Argument[-1];value",
42+
"System.Text;StringBuilder;false;Append;(System.Decimal);;Argument[-1];ReturnValue;value",
43+
"System.Text;StringBuilder;false;Append;(System.Double);;Argument[-1];ReturnValue;value",
44+
"System.Text;StringBuilder;false;Append;(System.Int16);;Argument[-1];ReturnValue;value",
45+
"System.Text;StringBuilder;false;Append;(System.Int32);;Argument[-1];ReturnValue;value",
46+
"System.Text;StringBuilder;false;Append;(System.Int64);;Argument[-1];ReturnValue;value",
47+
"System.Text;StringBuilder;false;Append;(System.Object);;Argument[0];Element of Argument[-1];value",
48+
"System.Text;StringBuilder;false;Append;(System.Object);;Argument[-1];ReturnValue;value",
49+
"System.Text;StringBuilder;false;Append;(System.ReadOnlyMemory<System.Char>);;Argument[-1];ReturnValue;value",
50+
"System.Text;StringBuilder;false;Append;(System.ReadOnlySpan<System.Char>);;Argument[-1];ReturnValue;value",
51+
"System.Text;StringBuilder;false;Append;(System.SByte);;Argument[-1];ReturnValue;value",
52+
"System.Text;StringBuilder;false;Append;(System.Single);;Argument[-1];ReturnValue;value",
53+
"System.Text;StringBuilder;false;Append;(System.String);;Argument[0];Element of Argument[-1];value",
54+
"System.Text;StringBuilder;false;Append;(System.String);;Argument[-1];ReturnValue;value",
55+
"System.Text;StringBuilder;false;Append;(System.String,System.Int32,System.Int32);;Argument[0];Element of Argument[-1];value",
56+
"System.Text;StringBuilder;false;Append;(System.String,System.Int32,System.Int32);;Argument[-1];ReturnValue;value",
57+
"System.Text;StringBuilder;false;Append;(System.Text.StringBuilder);;Argument[-1];ReturnValue;value",
58+
"System.Text;StringBuilder;false;Append;(System.Text.StringBuilder,System.Int32,System.Int32);;Argument[-1];ReturnValue;value",
59+
"System.Text;StringBuilder;false;Append;(System.UInt16);;Argument[-1];ReturnValue;value",
60+
"System.Text;StringBuilder;false;Append;(System.UInt32);;Argument[-1];ReturnValue;value",
61+
"System.Text;StringBuilder;false;Append;(System.UInt64);;Argument[-1];ReturnValue;value",
62+
"System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object);;Argument[1];Element of Argument[-1];value",
63+
"System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object);;Argument[2];Element of Argument[-1];value",
64+
"System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object);;Argument[-1];ReturnValue;value",
65+
"System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object);;Argument[1];Element of Argument[-1];value",
66+
"System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object);;Argument[2];Element of Argument[-1];value",
67+
"System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object);;Argument[3];Element of Argument[-1];value",
68+
"System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object);;Argument[-1];ReturnValue;value",
69+
"System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object,System.Object);;Argument[1];Element of Argument[-1];value",
70+
"System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object,System.Object);;Argument[2];Element of Argument[-1];value",
71+
"System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object,System.Object);;Argument[3];Element of Argument[-1];value",
72+
"System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object,System.Object);;Argument[4];Element of Argument[-1];value",
73+
"System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object,System.Object);;Argument[-1];ReturnValue;value",
74+
"System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object[]);;Argument[1];Element of Argument[-1];value",
75+
"System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object[]);;Argument[-1];ReturnValue;value",
76+
"System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object[]);;Element of Argument[2];Element of Argument[-1];value",
77+
"System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object);;Argument[0];Element of Argument[-1];value",
78+
"System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object);;Argument[1];Element of Argument[-1];value",
79+
"System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object);;Argument[-1];ReturnValue;value",
80+
"System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object);;Argument[0];Element of Argument[-1];value",
81+
"System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object);;Argument[1];Element of Argument[-1];value",
82+
"System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object);;Argument[2];Element of Argument[-1];value",
83+
"System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object);;Argument[-1];ReturnValue;value",
84+
"System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object,System.Object);;Argument[0];Element of Argument[-1];value",
85+
"System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object,System.Object);;Argument[1];Element of Argument[-1];value",
86+
"System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object,System.Object);;Argument[2];Element of Argument[-1];value",
87+
"System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object,System.Object);;Argument[3];Element of Argument[-1];value",
88+
"System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object,System.Object);;Argument[-1];ReturnValue;value",
89+
"System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object[]);;Argument[0];Element of Argument[-1];value",
90+
"System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object[]);;Argument[-1];ReturnValue;value",
91+
"System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object[]);;Element of Argument[1];Element of Argument[-1];value",
92+
"System.Text;StringBuilder;false;AppendJoin;(System.Char,System.Object[]);;Argument[-1];ReturnValue;value",
93+
"System.Text;StringBuilder;false;AppendJoin;(System.Char,System.Object[]);;Element of Argument[1];Element of Argument[-1];value",
94+
"System.Text;StringBuilder;false;AppendJoin;(System.Char,System.String[]);;Argument[-1];ReturnValue;value",
95+
"System.Text;StringBuilder;false;AppendJoin;(System.Char,System.String[]);;Element of Argument[1];Element of Argument[-1];value",
96+
"System.Text;StringBuilder;false;AppendJoin;(System.String,System.Object[]);;Argument[0];Element of Argument[-1];value",
97+
"System.Text;StringBuilder;false;AppendJoin;(System.String,System.Object[]);;Argument[-1];ReturnValue;value",
98+
"System.Text;StringBuilder;false;AppendJoin;(System.String,System.Object[]);;Element of Argument[1];Element of Argument[-1];value",
99+
"System.Text;StringBuilder;false;AppendJoin;(System.String,System.String[]);;Argument[0];Element of Argument[-1];value",
100+
"System.Text;StringBuilder;false;AppendJoin;(System.String,System.String[]);;Argument[-1];ReturnValue;value",
101+
"System.Text;StringBuilder;false;AppendJoin;(System.String,System.String[]);;Element of Argument[1];Element of Argument[-1];value",
102+
"System.Text;StringBuilder;false;AppendJoin<>;(System.Char,System.Collections.Generic.IEnumerable<T>);;Argument[-1];ReturnValue;value",
103+
"System.Text;StringBuilder;false;AppendJoin<>;(System.Char,System.Collections.Generic.IEnumerable<T>);;Element of Argument[1];Element of Argument[-1];value",
104+
"System.Text;StringBuilder;false;AppendJoin<>;(System.String,System.Collections.Generic.IEnumerable<T>);;Argument[0];Element of Argument[-1];value",
105+
"System.Text;StringBuilder;false;AppendJoin<>;(System.String,System.Collections.Generic.IEnumerable<T>);;Argument[-1];ReturnValue;value",
106+
"System.Text;StringBuilder;false;AppendJoin<>;(System.String,System.Collections.Generic.IEnumerable<T>);;Element of Argument[1];Element of Argument[-1];value",
107+
"System.Text;StringBuilder;false;AppendLine;();;Argument[-1];ReturnValue;value",
108+
"System.Text;StringBuilder;false;AppendLine;(System.String);;Argument[0];Element of Argument[-1];value",
109+
"System.Text;StringBuilder;false;AppendLine;(System.String);;Argument[-1];ReturnValue;value",
110+
"System.Text;StringBuilder;false;StringBuilder;(System.String);;Argument[0];Element of ReturnValue;value",
111+
"System.Text;StringBuilder;false;StringBuilder;(System.String,System.Int32);;Argument[0];Element of ReturnValue;value",
112+
"System.Text;StringBuilder;false;StringBuilder;(System.String,System.Int32,System.Int32,System.Int32);;Argument[0];Element of ReturnValue;value",
113+
"System.Text;StringBuilder;false;ToString;();;Element of Argument[-1];ReturnValue;taint",
114+
"System.Text;StringBuilder;false;ToString;(System.Int32,System.Int32);;Element of Argument[-1];ReturnValue;taint",
115+
]
116+
}
117+
}
118+
27119
/** The `System.Text.Encoding` class. */
28120
class SystemTextEncodingClass extends SystemTextClass {
29121
SystemTextEncodingClass() { this.hasName("Encoding") }

0 commit comments

Comments
 (0)