Skip to content

Commit 0aefb15

Browse files
committed
C#: Convert at least System.Collection.[Generic.]ICollection flow to CSV format.
1 parent e9d4e38 commit 0aefb15

File tree

16 files changed

+327
-49
lines changed

16 files changed

+327
-49
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ private module Frameworks {
108108
private import semmle.code.csharp.frameworks.system.IO
109109
private import semmle.code.csharp.frameworks.system.io.Compression
110110
private import semmle.code.csharp.frameworks.system.runtime.CompilerServices
111+
private import semmle.code.csharp.frameworks.system.security.Cryptography
111112
private import semmle.code.csharp.frameworks.system.security.cryptography.X509Certificates
112113
private import semmle.code.csharp.frameworks.system.Text
113114
private import semmle.code.csharp.frameworks.system.text.RegularExpressions

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

Lines changed: 0 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -575,55 +575,6 @@ class IEnumerableFlow extends LibraryTypeDataFlow, RefType {
575575
}
576576
}
577577

578-
/** Data flow for `System.Collections.[Generic.]ICollection` (and sub types). */
579-
class ICollectionFlow extends LibraryTypeDataFlow, RefType {
580-
ICollectionFlow() {
581-
exists(Interface i | i = this.getABaseType*().getUnboundDeclaration() |
582-
i instanceof SystemCollectionsICollectionInterface
583-
or
584-
i instanceof SystemCollectionsGenericICollectionInterface
585-
)
586-
}
587-
588-
override predicate callableFlow(
589-
CallableFlowSource source, AccessPath sourceAp, CallableFlowSink sink, AccessPath sinkAp,
590-
SourceDeclarationCallable c, boolean preservesValue
591-
) {
592-
preservesValue = true and
593-
exists(string name, int arity |
594-
name = c.getUndecoratedName() and
595-
arity = c.getNumberOfParameters() and
596-
c = this.getAMethod()
597-
|
598-
name = "CopyTo" and
599-
arity = 2 and
600-
source instanceof CallableFlowSourceQualifier and
601-
sourceAp = AccessPath::element() and
602-
sink = TCallableFlowSinkArg(0) and
603-
sinkAp = AccessPath::element()
604-
or
605-
name.regexpMatch("AsReadOnly|Clone") and
606-
source = TCallableFlowSourceArg(0) and
607-
sourceAp = AccessPath::element() and
608-
sink = TCallableFlowSinkReturn() and
609-
sinkAp = AccessPath::element()
610-
or
611-
name.regexpMatch("Peek|Pop") and
612-
source = TCallableFlowSourceQualifier() and
613-
sourceAp = AccessPath::element() and
614-
sink = TCallableFlowSinkReturn() and
615-
sinkAp = AccessPath::empty()
616-
or
617-
name = "InsertRange" and
618-
arity = 2 and
619-
source = TCallableFlowSourceArg(1) and
620-
sourceAp = AccessPath::element() and
621-
sink = TCallableFlowSinkQualifier() and
622-
sinkAp = AccessPath::element()
623-
)
624-
}
625-
}
626-
627578
abstract private class SyntheticTaskField extends SyntheticField {
628579
bindingset[this]
629580
SyntheticTaskField() { any() }

csharp/ql/lib/semmle/code/csharp/frameworks/System.qll

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,28 @@ class SystemArrayClass extends SystemClass {
6565
Property getLengthProperty() { result = this.getProperty("Length") }
6666
}
6767

68+
/** Data flow for `System.Array`. */
69+
private class SystemArrayFlowModelCsv extends SummaryModelCsv {
70+
override predicate row(string row) {
71+
row =
72+
[
73+
"System;Array;false;AsReadOnly<>;(T[]);;Element of Argument[0];Element of ReturnValue;value",
74+
"System;Array;false;Clone;();;Element of Argument[0];Element of ReturnValue;value",
75+
"System;Array;false;CopyTo;(System.Array,System.Int64);;Element of Argument[-1];Element of Argument[0];value",
76+
"System;Array;false;Find<>;(T[],System.Predicate<T>);;Element of Argument[0];Parameter[0] of Argument[1];value",
77+
"System;Array;false;Find<>;(T[],System.Predicate<T>);;Element of Argument[0];ReturnValue;value",
78+
"System;Array;false;FindAll<>;(T[],System.Predicate<T>);;Element of Argument[0];Parameter[0] of Argument[1];value",
79+
"System;Array;false;FindAll<>;(T[],System.Predicate<T>);;Element of Argument[0];ReturnValue;value",
80+
"System;Array;false;FindLast<>;(T[],System.Predicate<T>);;Element of Argument[0];Parameter[0] of Argument[1];value",
81+
"System;Array;false;FindLast<>;(T[],System.Predicate<T>);;Element of Argument[0];ReturnValue;value",
82+
"System;Array;false;Reverse;(System.Array);;Element of Argument[0];Element of ReturnValue;value",
83+
"System;Array;false;Reverse;(System.Array,System.Int32,System.Int32);;Element of Argument[0];Element of ReturnValue;value",
84+
"System;Array;false;Reverse<>;(T[]);;Element of Argument[0];Element of ReturnValue;value",
85+
"System;Array;false;Reverse<>;(T[],System.Int32,System.Int32);;Element of Argument[0];Element of ReturnValue;value",
86+
]
87+
}
88+
}
89+
6890
/** `System.Attribute` class. */
6991
class SystemAttributeClass extends SystemClass {
7092
SystemAttributeClass() { this.hasName("Attribute") }

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

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,14 @@ class SystemCollectionsICollectionInterface extends SystemCollectionsInterface {
6262
SystemCollectionsICollectionInterface() { this.hasName("ICollection") }
6363
}
6464

65+
/** Data flow for `System.Collections.ICollection`. */
66+
private class SystemCollectionsICollectionFlowModelCsv extends SummaryModelCsv {
67+
override predicate row(string row) {
68+
row =
69+
"System.Collections;ICollection;true;CopyTo;(System.Array,System.Int32);;Element of Argument[-1];Element of Argument[0];value"
70+
}
71+
}
72+
6573
/** The `System.Collections.IList` interface. */
6674
class SystemCollectionsIListInterface extends SystemCollectionsInterface {
6775
SystemCollectionsIListInterface() { this.hasName("IList") }
@@ -157,3 +165,34 @@ private class SystemCollectionsArrayListFlowModelCsv extends SummaryModelCsv {
157165
]
158166
}
159167
}
168+
169+
/** Data flow for `System.Collections.BitArray`. */
170+
private class SystemCollectionsBitArrayFlowModelCsv extends SummaryModelCsv {
171+
override predicate row(string row) {
172+
row =
173+
"System.Collections;BitArray;false;Clone;();;Element of Argument[0];Element of ReturnValue;value"
174+
}
175+
}
176+
177+
/** Data flow for `System.Collections.Queue`. */
178+
private class SystemCollectionsQueueFlowModelCsv extends SummaryModelCsv {
179+
override predicate row(string row) {
180+
row =
181+
[
182+
"System.Collections;Queue;false;Clone;();;Element of Argument[0];Element of ReturnValue;value",
183+
"System.Collections;Queue;false;Peek;();;Element of Argument[-1];ReturnValue;value",
184+
]
185+
}
186+
}
187+
188+
/** Data flow for `System.Collections.Stack`. */
189+
private class SystemCollectionsStackFlowModelCsv extends SummaryModelCsv {
190+
override predicate row(string row) {
191+
row =
192+
[
193+
"System.Collections;Stack;false;Clone;();;Element of Argument[0];Element of ReturnValue;value",
194+
"System.Collections;Stack;false;Peek;();;Element of Argument[-1];ReturnValue;value",
195+
"System.Collections;Stack;false;Pop;();;Element of Argument[-1];ReturnValue;value",
196+
]
197+
}
198+
}

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,13 @@ private class SystemComponentModelListSortDescriptionCollectionFlowModelCsv exte
5656
]
5757
}
5858
}
59+
60+
/** Data flow for `System.ComponentModel.ComponentCollection`. */
61+
private class SystemComponentModelComponentCollectionFlowModelCsv extends SummaryModelCsv {
62+
override predicate row(string row) {
63+
row =
64+
[
65+
"System.ComponentModel;ComponentCollection;false;CopyTo;(System.ComponentModel.IComponent[],System.Int32);;Element of Argument[-1];Element of Argument[0];value",
66+
]
67+
}
68+
}

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

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,3 +142,83 @@ private class SystemDataITableMappingCollectionFlowModelCsv extends SummaryModel
142142
]
143143
}
144144
}
145+
146+
/** Data flow for `System.Data.ConstraintCollection`. */
147+
private class SystemDataConstraintCollectionFlowModelCsv extends SummaryModelCsv {
148+
override predicate row(string row) {
149+
row =
150+
[
151+
"System.Data;ConstraintCollection;false;Add;(System.Data.Constraint);;Argument[0];Element of Argument[-1];value",
152+
"System.Data;ConstraintCollection;false;AddRange;(System.Data.Constraint[]);;Element of Argument[0];Element of Argument[-1];value",
153+
"System.Data;ConstraintCollection;false;CopyTo;(System.Data.Constraint[],System.Int32);;Element of Argument[-1];Element of Argument[0];value",
154+
]
155+
}
156+
}
157+
158+
/** Data flow for `System.Data.DataColumnCollection`. */
159+
private class SystemDataDataColumnCollectionFlowModelCsv extends SummaryModelCsv {
160+
override predicate row(string row) {
161+
row =
162+
[
163+
"System.Data;DataColumnCollection;false;Add;(System.Data.DataColumn);;Argument[0];Element of Argument[-1];value",
164+
"System.Data;DataColumnCollection;false;Add;(System.String);;Argument[0];Element of Argument[-1];value",
165+
"System.Data;DataColumnCollection;false;AddRange;(System.Data.DataColumn[]);;Element of Argument[0];Element of Argument[-1];value",
166+
"System.Data;DataColumnCollection;false;CopyTo;(System.Data.DataColumn[],System.Int32);;Element of Argument[-1];Element of Argument[0];value",
167+
]
168+
}
169+
}
170+
171+
/** Data flow for `System.Data.DataRelationCollection`. */
172+
private class SystemDataDataRelationCollectionFlowModelCsv extends SummaryModelCsv {
173+
override predicate row(string row) {
174+
row =
175+
[
176+
"System.Data;DataRelationCollection;false;Add;(System.Data.DataRelation);;Argument[0];Element of Argument[-1];value",
177+
"System.Data;DataRelationCollection;false;CopyTo;(System.Data.DataRelation[],System.Int32);;Element of Argument[-1];Element of Argument[0];value",
178+
"System.Data;DataRelationCollection;true;AddRange;(System.Data.DataRelation[]);;Element of Argument[0];Element of Argument[-1];value",
179+
]
180+
}
181+
}
182+
183+
/** Data flow for `System.Data.DataRawCollection`. */
184+
private class SystemDataDataRawCollectionFlowModelCsv extends SummaryModelCsv {
185+
override predicate row(string row) {
186+
row =
187+
[
188+
"System.Data;DataRowCollection;false;Add;(System.Data.DataRow);;Argument[0];Element of Argument[-1];value",
189+
"System.Data;DataRowCollection;false;Add;(System.Object[]);;Argument[0];Element of Argument[-1];value",
190+
"System.Data;DataRowCollection;false;CopyTo;(System.Data.DataRow[],System.Int32);;Element of Argument[-1];Element of Argument[0];value",
191+
"System.Data;DataRowCollection;false;Find;(System.Object);;Element of Argument[-1];ReturnValue;value",
192+
"System.Data;DataRowCollection;false;Find;(System.Object[]);;Element of Argument[-1];ReturnValue;value",
193+
]
194+
}
195+
}
196+
197+
/** Data flow for `System.Data.DataTableCollection`. */
198+
private class SystemDataDataTableCollectionFlowModelCsv extends SummaryModelCsv {
199+
override predicate row(string row) {
200+
row =
201+
[
202+
"System.Data;DataTableCollection;false;Add;(System.Data.DataTable);;Argument[0];Element of Argument[-1];value",
203+
"System.Data;DataTableCollection;false;Add;(System.String);;Argument[0];Element of Argument[-1];value",
204+
"System.Data;DataTableCollection;false;AddRange;(System.Data.DataTable[]);;Element of Argument[0];Element of Argument[-1];value",
205+
"System.Data;DataTableCollection;false;CopyTo;(System.Data.DataTable[],System.Int32);;Element of Argument[-1];Element of Argument[0];value",
206+
]
207+
}
208+
}
209+
210+
/** Data flow for `System.Data.DataViewSettingCollection`. */
211+
private class SystemDataDataViewSettingCollectionFlowModelCsv extends SummaryModelCsv {
212+
override predicate row(string row) {
213+
row =
214+
"System.Data;DataViewSettingCollection;false;CopyTo;(System.Data.DataViewSetting[],System.Int32);;Element of Argument[-1];Element of Argument[0];value"
215+
}
216+
}
217+
218+
/** Data flow for `System.Data.PropertyCollection`. */
219+
private class SystemDataPropertyCollectionFlowModelCsv extends SummaryModelCsv {
220+
override predicate row(string row) {
221+
row =
222+
"System.Data;PropertyCollection;false;Clone;();;Element of Argument[0];Element of ReturnValue;value"
223+
}
224+
}

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,3 +111,22 @@ private class SystemDiagnosticsTraceListenerCollectionFlowModelCsv extends Summa
111111
]
112112
}
113113
}
114+
115+
/** Data flow for `System.Diagnostics.ProcessModuleCollection`. */
116+
private class SystemDiagnosticsProcessModuleCollectionFlowModelCsv extends SummaryModelCsv {
117+
override predicate row(string row) {
118+
row =
119+
"System.Diagnostics;ProcessModuleCollection;false;CopyTo;(System.Diagnostics.ProcessModule[],System.Int32);;Element of Argument[-1];Element of Argument[0];value"
120+
}
121+
}
122+
123+
/** Data flow for `System.Diagnostics.ProcessThreadCollection`. */
124+
private class SystemDiagnosticsProcessThreadCollectionFlowModelCsv extends SummaryModelCsv {
125+
override predicate row(string row) {
126+
row =
127+
[
128+
"System.Diagnostics;ProcessThreadCollection;false;Add;(System.Diagnostics.ProcessThread);;Argument[0];Element of Argument[-1];value",
129+
"System.Diagnostics;ProcessThreadCollection;false;CopyTo;(System.Diagnostics.ProcessThread[],System.Int32);;Element of Argument[-1];Element of Argument[0];value",
130+
]
131+
}
132+
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,3 +97,11 @@ private class SystemNetCookieClassFlowModelCsv extends SummaryModelCsv {
9797
row = "System.Net;Cookie;false;get_Value;();;Argument[-1];ReturnValue;taint"
9898
}
9999
}
100+
101+
/** Data flow for `System.Net.HttpListenerPrefixCollection`. */
102+
private class SystemNetHttpListenerPrefixCollectionFlowModelCsv extends SummaryModelCsv {
103+
override predicate row(string row) {
104+
row =
105+
"System.Net;HttpListenerPrefixCollection;false;CopyTo;(System.Array,System.Int32);;Element of Argument[-1];Element of Argument[0];value"
106+
}
107+
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,3 +277,11 @@ class XmlReaderSettingsInstance extends Expr {
277277
)
278278
}
279279
}
280+
281+
/** Data flow for `System.Xml.XmlAttributeCollection`. */
282+
private class SystemXmlXmlAttributeCollectionFlowModelCsv extends SummaryModelCsv {
283+
override predicate row(string row) {
284+
row =
285+
"System.Xml;XmlAttributeCollection;false;CopyTo;(System.Xml.XmlAttribute[],System.Int32);;Element of Argument[-1];Element of Argument[0];value"
286+
}
287+
}

csharp/ql/lib/semmle/code/csharp/frameworks/system/collections/Concurrent.qll

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,22 @@ private class SystemCollectionsConcurrentConcurrentDictionaryFlowModelCsv extend
2020
]
2121
}
2222
}
23+
24+
/** Data flow for `System.Collections.Concurrent.BlockingCollection<>`. */
25+
private class SystemCollectionsConcurrentBlockingCollectionFlowModelCsv extends SummaryModelCsv {
26+
override predicate row(string row) {
27+
row =
28+
[
29+
"System.Collections.Concurrent;BlockingCollection<>;false;Add;(T);;Argument[0];Element of Argument[-1];value",
30+
"System.Collections.Concurrent;BlockingCollection<>;false;CopyTo;(T[],System.Int32);;Element of Argument[-1];Element of Argument[0];value",
31+
]
32+
}
33+
}
34+
35+
/** Data flow for `System.Collections.Concurrent.IProducerConsumerCollection<>`. */
36+
private class SystemCollectionsConcurrentIProducerConsumerCollectionFlowModelCsv extends SummaryModelCsv {
37+
override predicate row(string row) {
38+
row =
39+
"System.Collections.Concurrent;IProducerConsumerCollection<>;true;CopyTo;(T[],System.Int32);;Element of Argument[-1];Element of Argument[0];value"
40+
}
41+
}

0 commit comments

Comments
 (0)