Skip to content

Commit 90d7b94

Browse files
authored
Merge pull request #7413 from hvitved/csharp/fix-test
C#: Fix broken `FlowSummariesFiltered` test
2 parents b53e349 + 8f1b2b3 commit 90d7b94

File tree

5 files changed

+107
-7
lines changed

5 files changed

+107
-7
lines changed

csharp/ql/lib/semmle/code/csharp/Implements.qll

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,25 @@ private import Conversion
3636
*/
3737
cached
3838
predicate implements(Overridable m1, Overridable m2, ValueOrRefType t) {
39+
implementsVirtualizable(m1, m2, t)
40+
or
41+
exists(DeclarationWithAccessors d1, DeclarationWithAccessors d2, int kind |
42+
implementsVirtualizable(d1, d2, t) and
43+
hasAccessor(d1, m1, pragma[only_bind_into](kind)) and
44+
hasAccessor(d2, m2, pragma[only_bind_into](kind))
45+
)
46+
}
47+
48+
pragma[noinline]
49+
private predicate hasAccessor(DeclarationWithAccessors d, Accessor a, int kind) {
50+
a = d.getAnAccessor() and
51+
(
52+
accessors(a, kind, _, _, _) or
53+
event_accessors(a, kind, _, _, _)
54+
)
55+
}
56+
57+
private predicate implementsVirtualizable(Virtualizable m1, Virtualizable m2, ValueOrRefType t) {
3958
exists(Interface i |
4059
i = m2.getDeclaringType() and
4160
t.getABaseInterface+() = i and
@@ -66,7 +85,7 @@ predicate implements(Overridable m1, Overridable m2, ValueOrRefType t) {
6685
* for type `C`, because `C.M()` conflicts.
6786
*/
6887
pragma[nomagic]
69-
private Overridable getAnImplementedInterfaceMemberForSubType(Overridable m, ValueOrRefType t) {
88+
private Virtualizable getAnImplementedInterfaceMemberForSubType(Virtualizable m, ValueOrRefType t) {
7089
result = getACompatibleInterfaceMember(m) and
7190
t = m.getDeclaringType()
7291
or
@@ -78,7 +97,7 @@ private Overridable getAnImplementedInterfaceMemberForSubType(Overridable m, Val
7897
}
7998

8099
pragma[noinline]
81-
private predicate hasMemberCompatibleWithInterfaceMember(ValueOrRefType t, Overridable m) {
100+
private predicate hasMemberCompatibleWithInterfaceMember(ValueOrRefType t, Virtualizable m) {
82101
m = getACompatibleInterfaceMember(t.getAMember())
83102
}
84103

@@ -88,7 +107,7 @@ private predicate hasMemberCompatibleWithInterfaceMember(ValueOrRefType t, Overr
88107
* the interface member is accessed.
89108
*/
90109
pragma[nomagic]
91-
private Overridable getACompatibleInterfaceMember(Overridable m) {
110+
private Virtualizable getACompatibleInterfaceMember(Virtualizable m) {
92111
result = getACompatibleInterfaceMemberAux(m) and
93112
(
94113
// If there is both an implicit and an explicit compatible member
@@ -100,14 +119,14 @@ private Overridable getACompatibleInterfaceMember(Overridable m) {
100119
}
101120

102121
pragma[nomagic]
103-
private Overridable getACompatibleExplicitInterfaceMember(Overridable m, ValueOrRefType declType) {
122+
private Virtualizable getACompatibleExplicitInterfaceMember(Virtualizable m, ValueOrRefType declType) {
104123
result = getACompatibleInterfaceMemberAux(m) and
105124
declType = m.getDeclaringType() and
106125
m.implementsExplicitInterface()
107126
}
108127

109128
pragma[nomagic]
110-
private Overridable getACompatibleInterfaceMemberAux(Overridable m) {
129+
private Virtualizable getACompatibleInterfaceMemberAux(Virtualizable m) {
111130
result = getACompatibleInterfaceAccessor(m) or
112131
result = getACompatibleInterfaceIndexer(m) or
113132
result = getACompatibleInterfaceMethod(m)

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@ private import internal.DataFlowPublic
7878
private import internal.FlowSummaryImpl::Public
7979
private import internal.FlowSummaryImpl::Private::External
8080
private import internal.FlowSummaryImplSpecific
81-
private import semmle.code.csharp.dispatch.OverridableCallable
8281

8382
/**
8483
* A module importing the frameworks that provide external flow data,
@@ -367,7 +366,7 @@ class UnboundCallable extends Callable {
367366
*/
368367
predicate overridesOrImplementsUnbound(UnboundCallable that) {
369368
exists(Callable c |
370-
this.(OverridableCallable).overridesOrImplements(c) and
369+
this.(Overridable).overridesOrImplements(c) and
371370
that = c.getUnboundDeclaration()
372371
)
373372
}

csharp/ql/test/library-tests/dataflow/collections/CollectionFlow.expected

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,12 @@ edges
187187
| CollectionFlow.cs:373:52:373:53 | access to parameter ts [element] : A | CollectionFlow.cs:373:52:373:56 | access to array element |
188188
| CollectionFlow.cs:373:52:373:53 | access to parameter ts [element] : A | CollectionFlow.cs:373:52:373:56 | access to array element |
189189
| CollectionFlow.cs:375:49:375:52 | list [element] : A | CollectionFlow.cs:375:63:375:66 | access to parameter list [element] : A |
190+
| CollectionFlow.cs:375:49:375:52 | list [element] : A | CollectionFlow.cs:375:63:375:66 | access to parameter list [element] : A |
191+
| CollectionFlow.cs:375:49:375:52 | list [element] : A | CollectionFlow.cs:375:63:375:66 | access to parameter list [element] : A |
192+
| CollectionFlow.cs:375:49:375:52 | list [element] : A | CollectionFlow.cs:375:63:375:66 | access to parameter list [element] : A |
193+
| CollectionFlow.cs:375:63:375:66 | access to parameter list [element] : A | CollectionFlow.cs:375:63:375:69 | access to indexer |
194+
| CollectionFlow.cs:375:63:375:66 | access to parameter list [element] : A | CollectionFlow.cs:375:63:375:69 | access to indexer |
195+
| CollectionFlow.cs:375:63:375:66 | access to parameter list [element] : A | CollectionFlow.cs:375:63:375:69 | access to indexer |
190196
| CollectionFlow.cs:375:63:375:66 | access to parameter list [element] : A | CollectionFlow.cs:375:63:375:69 | access to indexer |
191197
| CollectionFlow.cs:377:61:377:64 | dict [element, property Value] : A | CollectionFlow.cs:377:75:377:78 | access to parameter dict [element, property Value] : A |
192198
| CollectionFlow.cs:377:75:377:78 | access to parameter dict [element, property Value] : A | CollectionFlow.cs:377:75:377:81 | access to indexer |
@@ -198,6 +204,12 @@ edges
198204
| CollectionFlow.cs:381:41:381:42 | access to parameter ts [element] : A | CollectionFlow.cs:381:41:381:45 | access to array element : A |
199205
| CollectionFlow.cs:381:41:381:42 | access to parameter ts [element] : A | CollectionFlow.cs:381:41:381:45 | access to array element : A |
200206
| CollectionFlow.cs:383:43:383:46 | list [element] : A | CollectionFlow.cs:383:52:383:55 | access to parameter list [element] : A |
207+
| CollectionFlow.cs:383:43:383:46 | list [element] : A | CollectionFlow.cs:383:52:383:55 | access to parameter list [element] : A |
208+
| CollectionFlow.cs:383:43:383:46 | list [element] : A | CollectionFlow.cs:383:52:383:55 | access to parameter list [element] : A |
209+
| CollectionFlow.cs:383:43:383:46 | list [element] : A | CollectionFlow.cs:383:52:383:55 | access to parameter list [element] : A |
210+
| CollectionFlow.cs:383:52:383:55 | access to parameter list [element] : A | CollectionFlow.cs:383:52:383:58 | access to indexer : A |
211+
| CollectionFlow.cs:383:52:383:55 | access to parameter list [element] : A | CollectionFlow.cs:383:52:383:58 | access to indexer : A |
212+
| CollectionFlow.cs:383:52:383:55 | access to parameter list [element] : A | CollectionFlow.cs:383:52:383:58 | access to indexer : A |
201213
| CollectionFlow.cs:383:52:383:55 | access to parameter list [element] : A | CollectionFlow.cs:383:52:383:58 | access to indexer : A |
202214
| CollectionFlow.cs:385:58:385:61 | dict [element, property Value] : A | CollectionFlow.cs:385:67:385:70 | access to parameter dict [element, property Value] : A |
203215
| CollectionFlow.cs:385:67:385:70 | access to parameter dict [element, property Value] : A | CollectionFlow.cs:385:67:385:73 | access to indexer : A |
@@ -390,6 +402,12 @@ nodes
390402
| CollectionFlow.cs:373:52:373:53 | access to parameter ts [element] : A | semmle.label | access to parameter ts [element] : A |
391403
| CollectionFlow.cs:373:52:373:56 | access to array element | semmle.label | access to array element |
392404
| CollectionFlow.cs:375:49:375:52 | list [element] : A | semmle.label | list [element] : A |
405+
| CollectionFlow.cs:375:49:375:52 | list [element] : A | semmle.label | list [element] : A |
406+
| CollectionFlow.cs:375:49:375:52 | list [element] : A | semmle.label | list [element] : A |
407+
| CollectionFlow.cs:375:49:375:52 | list [element] : A | semmle.label | list [element] : A |
408+
| CollectionFlow.cs:375:63:375:66 | access to parameter list [element] : A | semmle.label | access to parameter list [element] : A |
409+
| CollectionFlow.cs:375:63:375:66 | access to parameter list [element] : A | semmle.label | access to parameter list [element] : A |
410+
| CollectionFlow.cs:375:63:375:66 | access to parameter list [element] : A | semmle.label | access to parameter list [element] : A |
393411
| CollectionFlow.cs:375:63:375:66 | access to parameter list [element] : A | semmle.label | access to parameter list [element] : A |
394412
| CollectionFlow.cs:375:63:375:69 | access to indexer | semmle.label | access to indexer |
395413
| CollectionFlow.cs:377:61:377:64 | dict [element, property Value] : A | semmle.label | dict [element, property Value] : A |
@@ -406,7 +424,16 @@ nodes
406424
| CollectionFlow.cs:381:41:381:45 | access to array element : A | semmle.label | access to array element : A |
407425
| CollectionFlow.cs:381:41:381:45 | access to array element : A | semmle.label | access to array element : A |
408426
| CollectionFlow.cs:383:43:383:46 | list [element] : A | semmle.label | list [element] : A |
427+
| CollectionFlow.cs:383:43:383:46 | list [element] : A | semmle.label | list [element] : A |
428+
| CollectionFlow.cs:383:43:383:46 | list [element] : A | semmle.label | list [element] : A |
429+
| CollectionFlow.cs:383:43:383:46 | list [element] : A | semmle.label | list [element] : A |
409430
| CollectionFlow.cs:383:52:383:55 | access to parameter list [element] : A | semmle.label | access to parameter list [element] : A |
431+
| CollectionFlow.cs:383:52:383:55 | access to parameter list [element] : A | semmle.label | access to parameter list [element] : A |
432+
| CollectionFlow.cs:383:52:383:55 | access to parameter list [element] : A | semmle.label | access to parameter list [element] : A |
433+
| CollectionFlow.cs:383:52:383:55 | access to parameter list [element] : A | semmle.label | access to parameter list [element] : A |
434+
| CollectionFlow.cs:383:52:383:58 | access to indexer : A | semmle.label | access to indexer : A |
435+
| CollectionFlow.cs:383:52:383:58 | access to indexer : A | semmle.label | access to indexer : A |
436+
| CollectionFlow.cs:383:52:383:58 | access to indexer : A | semmle.label | access to indexer : A |
410437
| CollectionFlow.cs:383:52:383:58 | access to indexer : A | semmle.label | access to indexer : A |
411438
| CollectionFlow.cs:385:58:385:61 | dict [element, property Value] : A | semmle.label | dict [element, property Value] : A |
412439
| CollectionFlow.cs:385:67:385:70 | access to parameter dict [element, property Value] : A | semmle.label | access to parameter dict [element, property Value] : A |

csharp/ql/test/library-tests/overrides/Implements.expected

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,56 @@
55
| overrides.cs:172:27:172:30 | M<> | overrides.cs:162:11:162:14 | M<> |
66
| overrides.cs:177:18:177:21 | M<> | overrides.cs:162:11:162:14 | M<> |
77
| overrides.cs:193:19:193:22 | Prop | overrides.cs:182:16:182:19 | Prop |
8+
| overrides.cs:193:26:193:28 | get_Prop | overrides.cs:182:23:182:25 | get_Prop |
9+
| overrides.cs:193:45:193:47 | set_Prop | overrides.cs:182:28:182:30 | set_Prop |
810
| overrides.cs:205:23:205:26 | Prop | overrides.cs:182:16:182:19 | Prop |
911
| overrides.cs:205:23:205:26 | Prop | overrides.cs:182:16:182:19 | Prop |
12+
| overrides.cs:205:30:205:32 | get_Prop | overrides.cs:182:23:182:25 | get_Prop |
13+
| overrides.cs:205:30:205:32 | get_Prop | overrides.cs:182:23:182:25 | get_Prop |
14+
| overrides.cs:205:35:205:37 | set_Prop | overrides.cs:182:28:182:30 | set_Prop |
15+
| overrides.cs:205:35:205:37 | set_Prop | overrides.cs:182:28:182:30 | set_Prop |
1016
| overrides.cs:206:21:206:26 | Method | overrides.cs:198:14:198:19 | Method |
1117
| overrides.cs:206:21:206:26 | Method | overrides.cs:198:14:198:19 | Method |
1218
| overrides.cs:207:23:207:26 | Item | overrides.cs:200:16:200:19 | MyIndexer |
1319
| overrides.cs:207:23:207:26 | Item | overrides.cs:200:16:200:19 | MyIndexer |
20+
| overrides.cs:207:37:207:39 | get_Item | overrides.cs:200:30:200:32 | get_MyIndexer |
21+
| overrides.cs:207:37:207:39 | get_Item | overrides.cs:200:30:200:32 | get_MyIndexer |
22+
| overrides.cs:207:56:207:58 | set_Item | overrides.cs:200:35:200:37 | set_MyIndexer |
23+
| overrides.cs:207:56:207:58 | set_Item | overrides.cs:200:35:200:37 | set_MyIndexer |
1424
| overrides.cs:223:26:223:29 | M<> | overrides.cs:162:11:162:14 | M<> |
1525
| overrides.cs:224:28:224:35 | Property | overrides.cs:216:13:216:20 | Property |
26+
| overrides.cs:224:39:224:41 | get_Property | overrides.cs:216:24:216:26 | get_Property |
27+
| overrides.cs:224:44:224:46 | set_Property | overrides.cs:216:29:216:31 | set_Property |
1628
| overrides.cs:225:28:225:31 | Item | overrides.cs:217:13:217:16 | Item |
29+
| overrides.cs:225:42:225:44 | get_Item | overrides.cs:217:27:217:29 | get_Item |
1730
| overrides.cs:226:43:226:47 | Event | overrides.cs:218:28:218:32 | Event |
31+
| overrides.cs:226:43:226:47 | add_Event | overrides.cs:218:28:218:32 | add_Event |
32+
| overrides.cs:226:43:226:47 | remove_Event | overrides.cs:218:28:218:32 | remove_Event |
1833
| overrides.cs:241:24:241:27 | M<> | overrides.cs:162:11:162:14 | M<> |
1934
| overrides.cs:242:16:242:23 | Property | overrides.cs:216:13:216:20 | Property |
35+
| overrides.cs:242:27:242:29 | get_Property | overrides.cs:216:24:216:26 | get_Property |
36+
| overrides.cs:242:32:242:34 | set_Property | overrides.cs:216:29:216:31 | set_Property |
2037
| overrides.cs:243:16:243:19 | Item | overrides.cs:217:13:217:16 | Item |
38+
| overrides.cs:243:30:243:32 | get_Item | overrides.cs:217:27:217:29 | get_Item |
2139
| overrides.cs:244:31:244:35 | Event | overrides.cs:218:28:218:32 | Event |
40+
| overrides.cs:244:39:244:41 | add_Event | overrides.cs:218:28:218:32 | add_Event |
41+
| overrides.cs:244:47:244:52 | remove_Event | overrides.cs:218:28:218:32 | remove_Event |
2242
| overrides.cs:249:22:249:25 | M<> | overrides.cs:162:11:162:14 | M<> |
2343
| overrides.cs:250:24:250:31 | Property | overrides.cs:216:13:216:20 | Property |
44+
| overrides.cs:250:35:250:37 | get_Property | overrides.cs:216:24:216:26 | get_Property |
45+
| overrides.cs:250:40:250:42 | set_Property | overrides.cs:216:29:216:31 | set_Property |
2446
| overrides.cs:251:24:251:27 | Item | overrides.cs:217:13:217:16 | Item |
47+
| overrides.cs:251:38:251:40 | get_Item | overrides.cs:217:27:217:29 | get_Item |
2548
| overrides.cs:252:39:252:43 | Event | overrides.cs:218:28:218:32 | Event |
49+
| overrides.cs:252:39:252:43 | add_Event | overrides.cs:218:28:218:32 | add_Event |
50+
| overrides.cs:252:39:252:43 | remove_Event | overrides.cs:218:28:218:32 | remove_Event |
2651
| overrides.cs:267:27:267:30 | M<> | overrides.cs:162:11:162:14 | M<> |
2752
| overrides.cs:268:29:268:36 | Property | overrides.cs:216:13:216:20 | Property |
53+
| overrides.cs:268:40:268:42 | get_Property | overrides.cs:216:24:216:26 | get_Property |
54+
| overrides.cs:268:45:268:47 | set_Property | overrides.cs:216:29:216:31 | set_Property |
2855
| overrides.cs:269:29:269:32 | Item | overrides.cs:217:13:217:16 | Item |
56+
| overrides.cs:269:43:269:45 | get_Item | overrides.cs:217:27:217:29 | get_Item |
2957
| overrides.cs:270:44:270:48 | Event | overrides.cs:218:28:218:32 | Event |
58+
| overrides.cs:270:44:270:48 | add_Event | overrides.cs:218:28:218:32 | add_Event |
59+
| overrides.cs:270:44:270:48 | remove_Event | overrides.cs:218:28:218:32 | remove_Event |
3060
| overrides.cs:284:25:284:28 | M<> | overrides.cs:279:18:279:21 | M<> |

csharp/ql/test/library-tests/overrides/Overrides22.expected

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,29 @@
44
| overrides.A1.Item[int] | overrides.I5.Item[int] | implements |
55
| overrides.A1.M<T>(dynamic[], T) | overrides.I2<System.Object[]>.M<S>(Object[], S) | implements |
66
| overrides.A1.Property | overrides.I5.Property | implements |
7+
| overrides.A1.add_Event(EventHandler) | overrides.I5.add_Event(EventHandler) | implements |
8+
| overrides.A1.get_Item(int) | overrides.I5.get_Item(int) | implements |
9+
| overrides.A1.get_Property() | overrides.I5.get_Property() | implements |
10+
| overrides.A1.remove_Event(EventHandler) | overrides.I5.remove_Event(EventHandler) | implements |
11+
| overrides.A1.set_Property(int) | overrides.I5.set_Property(int) | implements |
712
| overrides.A4.Event | overrides.I5.Event | implements |
813
| overrides.A4.Item[int] | overrides.I5.Item[int] | implements |
914
| overrides.A4.M<T>(dynamic[], T) | overrides.I2<System.Object[]>.M<S>(Object[], S) | implements |
1015
| overrides.A4.Property | overrides.I5.Property | implements |
16+
| overrides.A4.add_Event(EventHandler) | overrides.I5.add_Event(EventHandler) | implements |
17+
| overrides.A4.get_Item(int) | overrides.I5.get_Item(int) | implements |
18+
| overrides.A4.get_Property() | overrides.I5.get_Property() | implements |
19+
| overrides.A4.remove_Event(EventHandler) | overrides.I5.remove_Event(EventHandler) | implements |
20+
| overrides.A4.set_Property(int) | overrides.I5.set_Property(int) | implements |
1121
| overrides.A6.Event | overrides.I5.Event | implements |
1222
| overrides.A6.Item[int] | overrides.I5.Item[int] | implements |
1323
| overrides.A6.M<T>(Object[], T) | overrides.I2<System.Object[]>.M<S>(Object[], S) | implements |
1424
| overrides.A6.Property | overrides.I5.Property | implements |
25+
| overrides.A6.add_Event(EventHandler) | overrides.I5.add_Event(EventHandler) | implements |
26+
| overrides.A6.get_Item(int) | overrides.I5.get_Item(int) | implements |
27+
| overrides.A6.get_Property() | overrides.I5.get_Property() | implements |
28+
| overrides.A6.remove_Event(EventHandler) | overrides.I5.remove_Event(EventHandler) | implements |
29+
| overrides.A6.set_Property(int) | overrides.I5.set_Property(int) | implements |
1530
| overrides.A8.Event | overrides.A1.Event | overrides |
1631
| overrides.A8.Item[int] | overrides.A1.Item[int] | overrides |
1732
| overrides.A8.M<T>(dynamic[], T) | overrides.A1.M<T>(dynamic[], T) | overrides |
@@ -53,13 +68,23 @@
5368
| overrides.C2.Prop | overrides.C1.Prop | overrides |
5469
| overrides.C2.Prop | overrides.I3.Prop | implements |
5570
| overrides.C2.get_Prop() | overrides.C1.get_Prop() | overrides |
71+
| overrides.C2.get_Prop() | overrides.I3.get_Prop() | implements |
5672
| overrides.C2.set_Prop(string) | overrides.C1.set_Prop(string) | overrides |
73+
| overrides.C2.set_Prop(string) | overrides.I3.set_Prop(string) | implements |
5774
| overrides.C3<>.Item[int] | overrides.I4.MyIndexer[int] | implements |
5875
| overrides.C3<>.Method() | overrides.I4.Method() | implements |
5976
| overrides.C3<>.Prop | overrides.I3.Prop | implements |
77+
| overrides.C3<>.get_Item(int) | overrides.I4.get_MyIndexer(int) | implements |
78+
| overrides.C3<>.get_Prop() | overrides.I3.get_Prop() | implements |
79+
| overrides.C3<>.set_Item(int, string) | overrides.I4.set_MyIndexer(int, string) | implements |
80+
| overrides.C3<>.set_Prop(string) | overrides.I3.set_Prop(string) | implements |
6081
| overrides.C3<System.Int32>.Item[int] | overrides.I4.MyIndexer[int] | implements |
6182
| overrides.C3<System.Int32>.Method() | overrides.I4.Method() | implements |
6283
| overrides.C3<System.Int32>.Prop | overrides.I3.Prop | implements |
84+
| overrides.C3<System.Int32>.get_Item(int) | overrides.I4.get_MyIndexer(int) | implements |
85+
| overrides.C3<System.Int32>.get_Prop() | overrides.I3.get_Prop() | implements |
86+
| overrides.C3<System.Int32>.set_Item(int, string) | overrides.I4.set_MyIndexer(int, string) | implements |
87+
| overrides.C3<System.Int32>.set_Prop(string) | overrides.I3.set_Prop(string) | implements |
6388
| overrides.D.ToString() | overrides.C.ToString() | overrides |
6489
| overrides.D.f2() | overrides.A.f2() | overrides |
6590
| overrides.E2.M() | overrides.E.M() | overrides |

0 commit comments

Comments
 (0)