Skip to content

Commit d3f2894

Browse files
committed
C#: Convert remaining missing parts of System.Collections.IEnumerable and sub types flow to CSV format (except for 'clearsContent').
1 parent 0aefb15 commit d3f2894

File tree

13 files changed

+199
-91
lines changed

13 files changed

+199
-91
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
@@ -105,6 +105,7 @@ private module Frameworks {
105105
private import semmle.code.csharp.frameworks.system.Linq
106106
private import semmle.code.csharp.frameworks.system.Net
107107
private import semmle.code.csharp.frameworks.system.net.Http
108+
private import semmle.code.csharp.frameworks.system.net.Mail
108109
private import semmle.code.csharp.frameworks.system.IO
109110
private import semmle.code.csharp.frameworks.system.io.Compression
110111
private import semmle.code.csharp.frameworks.system.runtime.CompilerServices

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

Lines changed: 0 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,7 @@
33
*/
44

55
import csharp
6-
private import semmle.code.csharp.frameworks.System
76
private import semmle.code.csharp.frameworks.system.Collections
8-
private import semmle.code.csharp.frameworks.system.collections.Generic
97
private import semmle.code.csharp.frameworks.system.linq.Expressions
108
private import semmle.code.csharp.frameworks.system.Text
119
private import semmle.code.csharp.frameworks.system.runtime.CompilerServices
@@ -240,14 +238,6 @@ class CallableFlowSinkArg extends CallableFlowSink, TCallableFlowSinkArg {
240238
}
241239
}
242240

243-
/** Gets the flow sink for the `j`th argument of the delegate at argument `i` of `callable`. */
244-
private CallableFlowSinkDelegateArg getDelegateFlowSinkArg(
245-
SourceDeclarationCallable callable, int i, int j
246-
) {
247-
result = TCallableFlowSinkDelegateArg(i, j) and
248-
hasDelegateArgumentPosition2(callable, i, j)
249-
}
250-
251241
/** A flow sink specification: parameter of a delegate argument. */
252242
class CallableFlowSinkDelegateArg extends CallableFlowSink, TCallableFlowSinkDelegateArg {
253243
private int delegateIndex;
@@ -488,84 +478,6 @@ class SystemTextStringBuilderFlow extends LibraryTypeDataFlow, SystemTextStringB
488478
class IEnumerableFlow extends LibraryTypeDataFlow, RefType {
489479
IEnumerableFlow() { this.getABaseType*() instanceof SystemCollectionsIEnumerableInterface }
490480

491-
override predicate callableFlow(
492-
CallableFlowSource source, AccessPath sourceAp, CallableFlowSink sink, AccessPath sinkAp,
493-
SourceDeclarationCallable c, boolean preservesValue
494-
) {
495-
preservesValue = true and
496-
(
497-
c = this.getFind() and
498-
sourceAp = AccessPath::element() and
499-
sinkAp = AccessPath::empty() and
500-
if c.(Method).isStatic()
501-
then
502-
source = TCallableFlowSourceArg(0) and
503-
(
504-
sink = TCallableFlowSinkReturn() or
505-
sink = getDelegateFlowSinkArg(c, 1, 0)
506-
)
507-
else (
508-
source = TCallableFlowSourceQualifier() and
509-
(
510-
sink = TCallableFlowSinkReturn() or
511-
sink = getDelegateFlowSinkArg(c, 0, 0)
512-
)
513-
)
514-
or
515-
exists(string name, int arity |
516-
arity = c.getNumberOfParameters() and
517-
c = this.getAMethod() and
518-
c.getUndecoratedName() = name
519-
|
520-
name = "Add" and
521-
arity = 1 and
522-
source = TCallableFlowSourceArg(0) and
523-
sourceAp = AccessPath::empty() and
524-
sink instanceof CallableFlowSinkQualifier and
525-
sinkAp = AccessPath::element()
526-
or
527-
name = "AddRange" and
528-
arity = 1 and
529-
source = TCallableFlowSourceArg(0) and
530-
sourceAp = AccessPath::element() and
531-
sink = TCallableFlowSinkQualifier() and
532-
sinkAp = AccessPath::element()
533-
or
534-
exists(Property current |
535-
name = "GetEnumerator" and
536-
source = TCallableFlowSourceQualifier() and
537-
sourceAp = AccessPath::element() and
538-
sink = TCallableFlowSinkReturn() and
539-
sinkAp = AccessPath::property(current) and
540-
current = c.getReturnType().(ValueOrRefType).getProperty("Current")
541-
)
542-
or
543-
name = "Repeat" and
544-
c.(Method).isStatic() and
545-
arity = 2 and
546-
source = TCallableFlowSourceArg(0) and
547-
sourceAp = AccessPath::empty() and
548-
sink = TCallableFlowSinkReturn() and
549-
sinkAp = AccessPath::element()
550-
or
551-
name = "Reverse" and
552-
source = TCallableFlowSourceArg(0) and
553-
sourceAp = AccessPath::element() and
554-
sink = TCallableFlowSinkReturn() and
555-
sinkAp = AccessPath::element()
556-
)
557-
)
558-
}
559-
560-
private SourceDeclarationMethod getFind() {
561-
exists(string name |
562-
name = result.getUndecoratedName() and
563-
result.getDeclaringType() = this.getABaseType*()
564-
|
565-
name.regexpMatch("Find(All|Last)?")
566-
)
567-
}
568-
569481
override predicate clearsContent(
570482
CallableFlowSource source, Content content, SourceDeclarationCallable callable
571483
) {

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,4 +293,12 @@ module JsonNET {
293293
]
294294
}
295295
}
296+
297+
/** Data flow for `Newtonsoft.JSon.Linq.JContainer` */
298+
private class NewtonsoftJsonLinqJContainerFlowModelCsv extends SummaryModelCsv {
299+
override predicate row(string row) {
300+
row =
301+
"Newtonsoft.Json.Linq;JContainer;true;Add;(System.Object);;Argument[0];Element of Argument[-1];value"
302+
}
303+
}
296304
}

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

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,22 @@ private class SystemComponentModelListSortDescriptionCollectionFlowModelCsv exte
6161
private class SystemComponentModelComponentCollectionFlowModelCsv extends SummaryModelCsv {
6262
override predicate row(string row) {
6363
row =
64-
[
65-
"System.ComponentModel;ComponentCollection;false;CopyTo;(System.ComponentModel.IComponent[],System.Int32);;Element of Argument[-1];Element of Argument[0];value",
66-
]
64+
"System.ComponentModel;ComponentCollection;false;CopyTo;(System.ComponentModel.IComponent[],System.Int32);;Element of Argument[-1];Element of Argument[0];value"
65+
}
66+
}
67+
68+
/** Data flow for `System.ComponentModel.AttributeCollection`. */
69+
private class SystemComponentModelAttributeCollectionFlowModelCsv extends SummaryModelCsv {
70+
override predicate row(string row) {
71+
row =
72+
"System.ComponentModel;AttributeCollection;false;GetEnumerator;();;Element of Argument[-1];Property[System.Collections.IEnumerator.Current] of ReturnValue;value"
73+
}
74+
}
75+
76+
/** Data flow for `System.ComponentModel.IBindingList`. */
77+
private class SystemComponentModelIBindingListFlowModelCsv extends SummaryModelCsv {
78+
override predicate row(string row) {
79+
row =
80+
"System.ComponentModel;IBindingList;true;Find;(System.ComponentModel.PropertyDescriptor,System.Object);;Element of Argument[-1];ReturnValue;value"
6781
}
6882
}

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,3 +105,19 @@ private class SystemNetHttpListenerPrefixCollectionFlowModelCsv extends SummaryM
105105
"System.Net;HttpListenerPrefixCollection;false;CopyTo;(System.Array,System.Int32);;Element of Argument[-1];Element of Argument[0];value"
106106
}
107107
}
108+
109+
/** Data flow for `System.Net.CookieCollection`. */
110+
private class SystemNetCookieCollectionFlowModelCsv extends SummaryModelCsv {
111+
override predicate row(string row) {
112+
row =
113+
"System.Net;CookieCollection;false;Add;(System.Net.CookieCollection);;Argument[0];Element of Argument[-1];value"
114+
}
115+
}
116+
117+
/** Data flow for `System.Net.WebHeaderCollection`. */
118+
private class SystemNetWebHeaderCollectionFlowModelCsv extends SummaryModelCsv {
119+
override predicate row(string row) {
120+
row =
121+
"System.Net;WebHeaderCollection;false;Add;(System.String);;Argument[0];Element of Argument[-1];value"
122+
}
123+
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,11 @@ private class SystemCollectionsConcurrentIProducerConsumerCollectionFlowModelCsv
3939
"System.Collections.Concurrent;IProducerConsumerCollection<>;true;CopyTo;(T[],System.Int32);;Element of Argument[-1];Element of Argument[0];value"
4040
}
4141
}
42+
43+
/** Data flow for `System.Collections.Concurrent.ConcurrentBag<>`. */
44+
private class SystemCollectionsConcurrentConcurrentBagFlowModelCsv extends SummaryModelCsv {
45+
override predicate row(string row) {
46+
row =
47+
"System.Collections.Concurrent;ConcurrentBag<>;false;Add;(T);;Argument[0];Element of Argument[-1];value"
48+
}
49+
}

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

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,3 +317,42 @@ private class SystemCollectionsGenericStackFlowModelCsv extends SummaryModelCsv
317317
]
318318
}
319319
}
320+
321+
/** Data flow for `System.Collections.Generic.HashSet<>. */
322+
private class SystemCollectionsGenericHashSetFlowModelCsv extends SummaryModelCsv {
323+
override predicate row(string row) {
324+
row =
325+
"System.Collections.Generic;HashSet<>;false;GetEnumerator;();;Element of Argument[-1];Property[System.Collections.Generic.HashSet<>+Enumerator.Current] of ReturnValue;value"
326+
}
327+
}
328+
329+
/** Data flow for `System.Collections.Generic.ISet<>. */
330+
private class SystemCollectionsGenericISetFlowModelCsv extends SummaryModelCsv {
331+
override predicate row(string row) {
332+
row =
333+
"System.Collections.Generic;ISet<>;true;Add;(T);;Argument[0];Element of Argument[-1];value"
334+
}
335+
}
336+
337+
/** Data flow for `System.Collections.Generic.LinkedList<>. */
338+
private class SystemCollectionsGenericLinkedListFlowModelCsv extends SummaryModelCsv {
339+
override predicate row(string row) {
340+
row =
341+
[
342+
"System.Collections.Generic;LinkedList<>;false;Find;(T);;Element of Argument[-1];ReturnValue;value",
343+
"System.Collections.Generic;LinkedList<>;false;FindLast;(T);;Element of Argument[-1];ReturnValue;value",
344+
"System.Collections.Generic;LinkedList<>;false;GetEnumerator;();;Element of Argument[-1];Property[System.Collections.Generic.LinkedList<>+Enumerator.Current] of ReturnValue;value",
345+
]
346+
}
347+
}
348+
349+
/** Data flow for `System.Collections.Generic.SortedSet<>. */
350+
private class SystemCollectionsGenericSortedSetFlowModelCsv extends SummaryModelCsv {
351+
override predicate row(string row) {
352+
row =
353+
[
354+
"System.Collections.Generic;SortedSet<>;false;GetEnumerator;();;Element of Argument[-1];Property[System.Collections.Generic.SortedSet<>+Enumerator.Current] of ReturnValue;value",
355+
"System.Collections.Generic;SortedSet<>;false;Reverse;();;Element of Argument[0];Element of ReturnValue;value",
356+
]
357+
}
358+
}

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

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,17 @@ private class SystemCollectionsImmutableImmutableSortedDictionaryFlowModelCsv ex
5858
}
5959
}
6060

61+
/** Data flow for `System.Collections.Immutable.IImmutableList<>. */
62+
private class SystemCollectionsImmutableIImmutableListFlowModelCsv extends SummaryModelCsv {
63+
override predicate row(string row) {
64+
row =
65+
[
66+
"System.Collections.Immutable;IImmutableList<>;true;Add;(T);;Argument[0];Element of Argument[-1];value",
67+
"System.Collections.Immutable;IImmutableList<>;true;AddRange;(System.Collections.Generic.IEnumerable<T>);;Element of Argument[0];Element of Argument[-1];value",
68+
]
69+
}
70+
}
71+
6172
/** Data flow for `System.Collections.Immutable.ImmutableList<>. */
6273
private class SystemCollectionsImmutableImmutableListFlowModelCsv extends SummaryModelCsv {
6374
override predicate row(string row) {
@@ -108,3 +119,57 @@ private class SystemCollectionsImmutableImmutableSortedSetFlowModelCsv extends S
108119
]
109120
}
110121
}
122+
123+
/** Data flow for `System.Collections.Immutable.IImmutableSet<>. */
124+
private class SystemCollectionsImmutableIImmutableSetFlowModelCsv extends SummaryModelCsv {
125+
override predicate row(string row) {
126+
row =
127+
"System.Collections.Immutable;IImmutableSet<>;true;Add;(T);;Argument[0];Element of Argument[-1];value"
128+
}
129+
}
130+
131+
/** Data flow for `System.Collections.Immutable.ImmutableArray<>. */
132+
private class SystemCollectionsImmutableImmutableArrayFlowModelCsv extends SummaryModelCsv {
133+
override predicate row(string row) {
134+
row =
135+
[
136+
"System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange;(System.Collections.Generic.IEnumerable<T>);;Element of Argument[0];Element of Argument[-1];value",
137+
"System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange;(System.Collections.Immutable.ImmutableArray<>);;Element of Argument[0];Element of Argument[-1];value",
138+
"System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange;(System.Collections.Immutable.ImmutableArray<>+Builder);;Element of Argument[0];Element of Argument[-1];value",
139+
"System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange;(T[]);;Element of Argument[0];Element of Argument[-1];value",
140+
"System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange<>;(System.Collections.Immutable.ImmutableArray<TDerived>);;Element of Argument[0];Element of Argument[-1];value",
141+
"System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange<>;(System.Collections.Immutable.ImmutableArray<TDerived>+Builder);;Element of Argument[0];Element of Argument[-1];value",
142+
"System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange<>;(TDerived[]);;Element of Argument[0];Element of Argument[-1];value",
143+
"System.Collections.Immutable;ImmutableArray<>+Builder;false;GetEnumerator;();;Element of Argument[-1];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value",
144+
"System.Collections.Immutable;ImmutableArray<>+Builder;false;Reverse;();;Element of Argument[0];Element of ReturnValue;value",
145+
]
146+
}
147+
}
148+
149+
/** Data flow for `System.Collections.Immutable.ImmutableHashSet<>. */
150+
private class SystemCollectionsImmutableImmutableHashSetFlowModelCsv extends SummaryModelCsv {
151+
override predicate row(string row) {
152+
row =
153+
[
154+
"System.Collections.Immutable;ImmutableHashSet<>+Builder;false;GetEnumerator;();;Element of Argument[-1];Property[System.Collections.Immutable.ImmutableHashSet<>+Enumerator.Current] of ReturnValue;value",
155+
"System.Collections.Immutable;ImmutableHashSet<>;false;Add;(T);;Argument[0];Element of Argument[-1];value",
156+
"System.Collections.Immutable;ImmutableHashSet<>;false;GetEnumerator;();;Element of Argument[-1];Property[System.Collections.Immutable.ImmutableHashSet<>+Enumerator.Current] of ReturnValue;value",
157+
]
158+
}
159+
}
160+
161+
/** Data flow for `System.Collections.Immutable.ImmutableQueue<>. */
162+
private class SystemCollectionsImmutableImmutableQueueFlowModelCsv extends SummaryModelCsv {
163+
override predicate row(string row) {
164+
row =
165+
"System.Collections.Immutable;ImmutableQueue<>;false;GetEnumerator;();;Element of Argument[-1];Property[System.Collections.Immutable.ImmutableQueue<>+Enumerator.Current] of ReturnValue;value"
166+
}
167+
}
168+
169+
/** Data flow for `System.Collections.Immutable.ImmutableStack<>. */
170+
private class SystemCollectionsImmutableImmutableStackFlowModelCsv extends SummaryModelCsv {
171+
override predicate row(string row) {
172+
row =
173+
"System.Collections.Immutable;ImmutableStack<>;false;GetEnumerator;();;Element of Argument[-1];Property[System.Collections.Immutable.ImmutableStack<>+Enumerator.Current] of ReturnValue;value"
174+
}
175+
}

csharp/ql/lib/semmle/code/csharp/frameworks/system/componentmodel/Design.qll

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,11 @@ private class SystemComponentModelDesignDesignerVerbCollectionFlowModelCsv exten
2828
]
2929
}
3030
}
31+
32+
/** Data flow for `System.ComponentModel.Design.DesignerCollection`. */
33+
private class SystemComponentModelDesignDesignerCollectionFlowModelCsv extends SummaryModelCsv {
34+
override predicate row(string row) {
35+
row =
36+
"System.ComponentModel.Design;DesignerCollection;false;GetEnumerator;();;Element of Argument[-1];Property[System.Collections.IEnumerator.Current] of ReturnValue;value"
37+
}
38+
}

csharp/ql/lib/semmle/code/csharp/frameworks/system/net/Http.qll

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,19 @@ private class SystemNetHttpHttpRequestOptionsFlowModelCsv extends SummaryModelCs
1212
]
1313
}
1414
}
15+
16+
/** Data flow for `System.Net.Http.MultipartContent`. */
17+
private class SystemNetHttpMultipartContentFlowModelCsv extends SummaryModelCsv {
18+
override predicate row(string row) {
19+
row =
20+
"System.Net.Http;MultipartContent;false;Add;(System.Net.Http.HttpContent);;Argument[0];Element of Argument[-1];value"
21+
}
22+
}
23+
24+
/** Data flow for `System.Net.Http.MultipartFormDataContent`. */
25+
private class SystemNetHttpMultipartFormDataContentFlowModelCsv extends SummaryModelCsv {
26+
override predicate row(string row) {
27+
row =
28+
"System.Net.Http;MultipartFormDataContent;false;Add;(System.Net.Http.HttpContent);;Argument[0];Element of Argument[-1];value"
29+
}
30+
}

0 commit comments

Comments
 (0)