Merge pull request #7413 from hvitved/csharp/fix-test

C#: Fix broken `FlowSummariesFiltered` test
This commit is contained in:
Michael Nebel
2021-12-16 09:31:33 +01:00
committed by GitHub
5 changed files with 107 additions and 7 deletions

View File

@@ -36,6 +36,25 @@ private import Conversion
*/
cached
predicate implements(Overridable m1, Overridable m2, ValueOrRefType t) {
implementsVirtualizable(m1, m2, t)
or
exists(DeclarationWithAccessors d1, DeclarationWithAccessors d2, int kind |
implementsVirtualizable(d1, d2, t) and
hasAccessor(d1, m1, pragma[only_bind_into](kind)) and
hasAccessor(d2, m2, pragma[only_bind_into](kind))
)
}
pragma[noinline]
private predicate hasAccessor(DeclarationWithAccessors d, Accessor a, int kind) {
a = d.getAnAccessor() and
(
accessors(a, kind, _, _, _) or
event_accessors(a, kind, _, _, _)
)
}
private predicate implementsVirtualizable(Virtualizable m1, Virtualizable m2, ValueOrRefType t) {
exists(Interface i |
i = m2.getDeclaringType() and
t.getABaseInterface+() = i and
@@ -66,7 +85,7 @@ predicate implements(Overridable m1, Overridable m2, ValueOrRefType t) {
* for type `C`, because `C.M()` conflicts.
*/
pragma[nomagic]
private Overridable getAnImplementedInterfaceMemberForSubType(Overridable m, ValueOrRefType t) {
private Virtualizable getAnImplementedInterfaceMemberForSubType(Virtualizable m, ValueOrRefType t) {
result = getACompatibleInterfaceMember(m) and
t = m.getDeclaringType()
or
@@ -78,7 +97,7 @@ private Overridable getAnImplementedInterfaceMemberForSubType(Overridable m, Val
}
pragma[noinline]
private predicate hasMemberCompatibleWithInterfaceMember(ValueOrRefType t, Overridable m) {
private predicate hasMemberCompatibleWithInterfaceMember(ValueOrRefType t, Virtualizable m) {
m = getACompatibleInterfaceMember(t.getAMember())
}
@@ -88,7 +107,7 @@ private predicate hasMemberCompatibleWithInterfaceMember(ValueOrRefType t, Overr
* the interface member is accessed.
*/
pragma[nomagic]
private Overridable getACompatibleInterfaceMember(Overridable m) {
private Virtualizable getACompatibleInterfaceMember(Virtualizable m) {
result = getACompatibleInterfaceMemberAux(m) and
(
// If there is both an implicit and an explicit compatible member
@@ -100,14 +119,14 @@ private Overridable getACompatibleInterfaceMember(Overridable m) {
}
pragma[nomagic]
private Overridable getACompatibleExplicitInterfaceMember(Overridable m, ValueOrRefType declType) {
private Virtualizable getACompatibleExplicitInterfaceMember(Virtualizable m, ValueOrRefType declType) {
result = getACompatibleInterfaceMemberAux(m) and
declType = m.getDeclaringType() and
m.implementsExplicitInterface()
}
pragma[nomagic]
private Overridable getACompatibleInterfaceMemberAux(Overridable m) {
private Virtualizable getACompatibleInterfaceMemberAux(Virtualizable m) {
result = getACompatibleInterfaceAccessor(m) or
result = getACompatibleInterfaceIndexer(m) or
result = getACompatibleInterfaceMethod(m)

View File

@@ -78,7 +78,6 @@ private import internal.DataFlowPublic
private import internal.FlowSummaryImpl::Public
private import internal.FlowSummaryImpl::Private::External
private import internal.FlowSummaryImplSpecific
private import semmle.code.csharp.dispatch.OverridableCallable
/**
* A module importing the frameworks that provide external flow data,
@@ -367,7 +366,7 @@ class UnboundCallable extends Callable {
*/
predicate overridesOrImplementsUnbound(UnboundCallable that) {
exists(Callable c |
this.(OverridableCallable).overridesOrImplements(c) and
this.(Overridable).overridesOrImplements(c) and
that = c.getUnboundDeclaration()
)
}

View File

@@ -187,6 +187,12 @@ edges
| CollectionFlow.cs:373:52:373:53 | access to parameter ts [element] : A | CollectionFlow.cs:373:52:373:56 | access to array element |
| CollectionFlow.cs:373:52:373:53 | access to parameter ts [element] : A | CollectionFlow.cs:373:52:373:56 | access to array element |
| CollectionFlow.cs:375:49:375:52 | list [element] : A | CollectionFlow.cs:375:63:375:66 | access to parameter list [element] : A |
| CollectionFlow.cs:375:49:375:52 | list [element] : A | CollectionFlow.cs:375:63:375:66 | access to parameter list [element] : A |
| CollectionFlow.cs:375:49:375:52 | list [element] : A | CollectionFlow.cs:375:63:375:66 | access to parameter list [element] : A |
| CollectionFlow.cs:375:49:375:52 | list [element] : A | CollectionFlow.cs:375:63:375:66 | access to parameter list [element] : A |
| CollectionFlow.cs:375:63:375:66 | access to parameter list [element] : A | CollectionFlow.cs:375:63:375:69 | access to indexer |
| CollectionFlow.cs:375:63:375:66 | access to parameter list [element] : A | CollectionFlow.cs:375:63:375:69 | access to indexer |
| CollectionFlow.cs:375:63:375:66 | access to parameter list [element] : A | CollectionFlow.cs:375:63:375:69 | access to indexer |
| CollectionFlow.cs:375:63:375:66 | access to parameter list [element] : A | CollectionFlow.cs:375:63:375:69 | access to indexer |
| 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 |
| 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
| CollectionFlow.cs:381:41:381:42 | access to parameter ts [element] : A | CollectionFlow.cs:381:41:381:45 | access to array element : A |
| CollectionFlow.cs:381:41:381:42 | access to parameter ts [element] : A | CollectionFlow.cs:381:41:381:45 | access to array element : A |
| CollectionFlow.cs:383:43:383:46 | list [element] : A | CollectionFlow.cs:383:52:383:55 | access to parameter list [element] : A |
| CollectionFlow.cs:383:43:383:46 | list [element] : A | CollectionFlow.cs:383:52:383:55 | access to parameter list [element] : A |
| CollectionFlow.cs:383:43:383:46 | list [element] : A | CollectionFlow.cs:383:52:383:55 | access to parameter list [element] : A |
| CollectionFlow.cs:383:43:383:46 | list [element] : A | CollectionFlow.cs:383:52:383:55 | access to parameter list [element] : A |
| CollectionFlow.cs:383:52:383:55 | access to parameter list [element] : A | CollectionFlow.cs:383:52:383:58 | access to indexer : A |
| CollectionFlow.cs:383:52:383:55 | access to parameter list [element] : A | CollectionFlow.cs:383:52:383:58 | access to indexer : A |
| CollectionFlow.cs:383:52:383:55 | access to parameter list [element] : A | CollectionFlow.cs:383:52:383:58 | access to indexer : A |
| CollectionFlow.cs:383:52:383:55 | access to parameter list [element] : A | CollectionFlow.cs:383:52:383:58 | access to indexer : A |
| 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 |
| 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
| CollectionFlow.cs:373:52:373:53 | access to parameter ts [element] : A | semmle.label | access to parameter ts [element] : A |
| CollectionFlow.cs:373:52:373:56 | access to array element | semmle.label | access to array element |
| CollectionFlow.cs:375:49:375:52 | list [element] : A | semmle.label | list [element] : A |
| CollectionFlow.cs:375:49:375:52 | list [element] : A | semmle.label | list [element] : A |
| CollectionFlow.cs:375:49:375:52 | list [element] : A | semmle.label | list [element] : A |
| CollectionFlow.cs:375:49:375:52 | list [element] : A | semmle.label | list [element] : A |
| CollectionFlow.cs:375:63:375:66 | access to parameter list [element] : A | semmle.label | access to parameter list [element] : A |
| CollectionFlow.cs:375:63:375:66 | access to parameter list [element] : A | semmle.label | access to parameter list [element] : A |
| CollectionFlow.cs:375:63:375:66 | access to parameter list [element] : A | semmle.label | access to parameter list [element] : A |
| CollectionFlow.cs:375:63:375:66 | access to parameter list [element] : A | semmle.label | access to parameter list [element] : A |
| CollectionFlow.cs:375:63:375:69 | access to indexer | semmle.label | access to indexer |
| CollectionFlow.cs:377:61:377:64 | dict [element, property Value] : A | semmle.label | dict [element, property Value] : A |
@@ -406,7 +424,16 @@ nodes
| CollectionFlow.cs:381:41:381:45 | access to array element : A | semmle.label | access to array element : A |
| CollectionFlow.cs:381:41:381:45 | access to array element : A | semmle.label | access to array element : A |
| CollectionFlow.cs:383:43:383:46 | list [element] : A | semmle.label | list [element] : A |
| CollectionFlow.cs:383:43:383:46 | list [element] : A | semmle.label | list [element] : A |
| CollectionFlow.cs:383:43:383:46 | list [element] : A | semmle.label | list [element] : A |
| CollectionFlow.cs:383:43:383:46 | list [element] : A | semmle.label | list [element] : A |
| CollectionFlow.cs:383:52:383:55 | access to parameter list [element] : A | semmle.label | access to parameter list [element] : A |
| CollectionFlow.cs:383:52:383:55 | access to parameter list [element] : A | semmle.label | access to parameter list [element] : A |
| CollectionFlow.cs:383:52:383:55 | access to parameter list [element] : A | semmle.label | access to parameter list [element] : A |
| CollectionFlow.cs:383:52:383:55 | access to parameter list [element] : A | semmle.label | access to parameter list [element] : A |
| CollectionFlow.cs:383:52:383:58 | access to indexer : A | semmle.label | access to indexer : A |
| CollectionFlow.cs:383:52:383:58 | access to indexer : A | semmle.label | access to indexer : A |
| CollectionFlow.cs:383:52:383:58 | access to indexer : A | semmle.label | access to indexer : A |
| CollectionFlow.cs:383:52:383:58 | access to indexer : A | semmle.label | access to indexer : A |
| CollectionFlow.cs:385:58:385:61 | dict [element, property Value] : A | semmle.label | dict [element, property Value] : A |
| CollectionFlow.cs:385:67:385:70 | access to parameter dict [element, property Value] : A | semmle.label | access to parameter dict [element, property Value] : A |

View File

@@ -5,26 +5,56 @@
| overrides.cs:172:27:172:30 | M<> | overrides.cs:162:11:162:14 | M<> |
| overrides.cs:177:18:177:21 | M<> | overrides.cs:162:11:162:14 | M<> |
| overrides.cs:193:19:193:22 | Prop | overrides.cs:182:16:182:19 | Prop |
| overrides.cs:193:26:193:28 | get_Prop | overrides.cs:182:23:182:25 | get_Prop |
| overrides.cs:193:45:193:47 | set_Prop | overrides.cs:182:28:182:30 | set_Prop |
| overrides.cs:205:23:205:26 | Prop | overrides.cs:182:16:182:19 | Prop |
| overrides.cs:205:23:205:26 | Prop | overrides.cs:182:16:182:19 | Prop |
| overrides.cs:205:30:205:32 | get_Prop | overrides.cs:182:23:182:25 | get_Prop |
| overrides.cs:205:30:205:32 | get_Prop | overrides.cs:182:23:182:25 | get_Prop |
| overrides.cs:205:35:205:37 | set_Prop | overrides.cs:182:28:182:30 | set_Prop |
| overrides.cs:205:35:205:37 | set_Prop | overrides.cs:182:28:182:30 | set_Prop |
| overrides.cs:206:21:206:26 | Method | overrides.cs:198:14:198:19 | Method |
| overrides.cs:206:21:206:26 | Method | overrides.cs:198:14:198:19 | Method |
| overrides.cs:207:23:207:26 | Item | overrides.cs:200:16:200:19 | MyIndexer |
| overrides.cs:207:23:207:26 | Item | overrides.cs:200:16:200:19 | MyIndexer |
| overrides.cs:207:37:207:39 | get_Item | overrides.cs:200:30:200:32 | get_MyIndexer |
| overrides.cs:207:37:207:39 | get_Item | overrides.cs:200:30:200:32 | get_MyIndexer |
| overrides.cs:207:56:207:58 | set_Item | overrides.cs:200:35:200:37 | set_MyIndexer |
| overrides.cs:207:56:207:58 | set_Item | overrides.cs:200:35:200:37 | set_MyIndexer |
| overrides.cs:223:26:223:29 | M<> | overrides.cs:162:11:162:14 | M<> |
| overrides.cs:224:28:224:35 | Property | overrides.cs:216:13:216:20 | Property |
| overrides.cs:224:39:224:41 | get_Property | overrides.cs:216:24:216:26 | get_Property |
| overrides.cs:224:44:224:46 | set_Property | overrides.cs:216:29:216:31 | set_Property |
| overrides.cs:225:28:225:31 | Item | overrides.cs:217:13:217:16 | Item |
| overrides.cs:225:42:225:44 | get_Item | overrides.cs:217:27:217:29 | get_Item |
| overrides.cs:226:43:226:47 | Event | overrides.cs:218:28:218:32 | Event |
| overrides.cs:226:43:226:47 | add_Event | overrides.cs:218:28:218:32 | add_Event |
| overrides.cs:226:43:226:47 | remove_Event | overrides.cs:218:28:218:32 | remove_Event |
| overrides.cs:241:24:241:27 | M<> | overrides.cs:162:11:162:14 | M<> |
| overrides.cs:242:16:242:23 | Property | overrides.cs:216:13:216:20 | Property |
| overrides.cs:242:27:242:29 | get_Property | overrides.cs:216:24:216:26 | get_Property |
| overrides.cs:242:32:242:34 | set_Property | overrides.cs:216:29:216:31 | set_Property |
| overrides.cs:243:16:243:19 | Item | overrides.cs:217:13:217:16 | Item |
| overrides.cs:243:30:243:32 | get_Item | overrides.cs:217:27:217:29 | get_Item |
| overrides.cs:244:31:244:35 | Event | overrides.cs:218:28:218:32 | Event |
| overrides.cs:244:39:244:41 | add_Event | overrides.cs:218:28:218:32 | add_Event |
| overrides.cs:244:47:244:52 | remove_Event | overrides.cs:218:28:218:32 | remove_Event |
| overrides.cs:249:22:249:25 | M<> | overrides.cs:162:11:162:14 | M<> |
| overrides.cs:250:24:250:31 | Property | overrides.cs:216:13:216:20 | Property |
| overrides.cs:250:35:250:37 | get_Property | overrides.cs:216:24:216:26 | get_Property |
| overrides.cs:250:40:250:42 | set_Property | overrides.cs:216:29:216:31 | set_Property |
| overrides.cs:251:24:251:27 | Item | overrides.cs:217:13:217:16 | Item |
| overrides.cs:251:38:251:40 | get_Item | overrides.cs:217:27:217:29 | get_Item |
| overrides.cs:252:39:252:43 | Event | overrides.cs:218:28:218:32 | Event |
| overrides.cs:252:39:252:43 | add_Event | overrides.cs:218:28:218:32 | add_Event |
| overrides.cs:252:39:252:43 | remove_Event | overrides.cs:218:28:218:32 | remove_Event |
| overrides.cs:267:27:267:30 | M<> | overrides.cs:162:11:162:14 | M<> |
| overrides.cs:268:29:268:36 | Property | overrides.cs:216:13:216:20 | Property |
| overrides.cs:268:40:268:42 | get_Property | overrides.cs:216:24:216:26 | get_Property |
| overrides.cs:268:45:268:47 | set_Property | overrides.cs:216:29:216:31 | set_Property |
| overrides.cs:269:29:269:32 | Item | overrides.cs:217:13:217:16 | Item |
| overrides.cs:269:43:269:45 | get_Item | overrides.cs:217:27:217:29 | get_Item |
| overrides.cs:270:44:270:48 | Event | overrides.cs:218:28:218:32 | Event |
| overrides.cs:270:44:270:48 | add_Event | overrides.cs:218:28:218:32 | add_Event |
| overrides.cs:270:44:270:48 | remove_Event | overrides.cs:218:28:218:32 | remove_Event |
| overrides.cs:284:25:284:28 | M<> | overrides.cs:279:18:279:21 | M<> |

View File

@@ -4,14 +4,29 @@
| overrides.A1.Item[int] | overrides.I5.Item[int] | implements |
| overrides.A1.M<T>(dynamic[], T) | overrides.I2<System.Object[]>.M<S>(Object[], S) | implements |
| overrides.A1.Property | overrides.I5.Property | implements |
| overrides.A1.add_Event(EventHandler) | overrides.I5.add_Event(EventHandler) | implements |
| overrides.A1.get_Item(int) | overrides.I5.get_Item(int) | implements |
| overrides.A1.get_Property() | overrides.I5.get_Property() | implements |
| overrides.A1.remove_Event(EventHandler) | overrides.I5.remove_Event(EventHandler) | implements |
| overrides.A1.set_Property(int) | overrides.I5.set_Property(int) | implements |
| overrides.A4.Event | overrides.I5.Event | implements |
| overrides.A4.Item[int] | overrides.I5.Item[int] | implements |
| overrides.A4.M<T>(dynamic[], T) | overrides.I2<System.Object[]>.M<S>(Object[], S) | implements |
| overrides.A4.Property | overrides.I5.Property | implements |
| overrides.A4.add_Event(EventHandler) | overrides.I5.add_Event(EventHandler) | implements |
| overrides.A4.get_Item(int) | overrides.I5.get_Item(int) | implements |
| overrides.A4.get_Property() | overrides.I5.get_Property() | implements |
| overrides.A4.remove_Event(EventHandler) | overrides.I5.remove_Event(EventHandler) | implements |
| overrides.A4.set_Property(int) | overrides.I5.set_Property(int) | implements |
| overrides.A6.Event | overrides.I5.Event | implements |
| overrides.A6.Item[int] | overrides.I5.Item[int] | implements |
| overrides.A6.M<T>(Object[], T) | overrides.I2<System.Object[]>.M<S>(Object[], S) | implements |
| overrides.A6.Property | overrides.I5.Property | implements |
| overrides.A6.add_Event(EventHandler) | overrides.I5.add_Event(EventHandler) | implements |
| overrides.A6.get_Item(int) | overrides.I5.get_Item(int) | implements |
| overrides.A6.get_Property() | overrides.I5.get_Property() | implements |
| overrides.A6.remove_Event(EventHandler) | overrides.I5.remove_Event(EventHandler) | implements |
| overrides.A6.set_Property(int) | overrides.I5.set_Property(int) | implements |
| overrides.A8.Event | overrides.A1.Event | overrides |
| overrides.A8.Item[int] | overrides.A1.Item[int] | overrides |
| overrides.A8.M<T>(dynamic[], T) | overrides.A1.M<T>(dynamic[], T) | overrides |
@@ -53,13 +68,23 @@
| overrides.C2.Prop | overrides.C1.Prop | overrides |
| overrides.C2.Prop | overrides.I3.Prop | implements |
| overrides.C2.get_Prop() | overrides.C1.get_Prop() | overrides |
| overrides.C2.get_Prop() | overrides.I3.get_Prop() | implements |
| overrides.C2.set_Prop(string) | overrides.C1.set_Prop(string) | overrides |
| overrides.C2.set_Prop(string) | overrides.I3.set_Prop(string) | implements |
| overrides.C3<>.Item[int] | overrides.I4.MyIndexer[int] | implements |
| overrides.C3<>.Method() | overrides.I4.Method() | implements |
| overrides.C3<>.Prop | overrides.I3.Prop | implements |
| overrides.C3<>.get_Item(int) | overrides.I4.get_MyIndexer(int) | implements |
| overrides.C3<>.get_Prop() | overrides.I3.get_Prop() | implements |
| overrides.C3<>.set_Item(int, string) | overrides.I4.set_MyIndexer(int, string) | implements |
| overrides.C3<>.set_Prop(string) | overrides.I3.set_Prop(string) | implements |
| overrides.C3<System.Int32>.Item[int] | overrides.I4.MyIndexer[int] | implements |
| overrides.C3<System.Int32>.Method() | overrides.I4.Method() | implements |
| overrides.C3<System.Int32>.Prop | overrides.I3.Prop | implements |
| overrides.C3<System.Int32>.get_Item(int) | overrides.I4.get_MyIndexer(int) | implements |
| overrides.C3<System.Int32>.get_Prop() | overrides.I3.get_Prop() | implements |
| overrides.C3<System.Int32>.set_Item(int, string) | overrides.I4.set_MyIndexer(int, string) | implements |
| overrides.C3<System.Int32>.set_Prop(string) | overrides.I3.set_Prop(string) | implements |
| overrides.D.ToString() | overrides.C.ToString() | overrides |
| overrides.D.f2() | overrides.A.f2() | overrides |
| overrides.E2.M() | overrides.E.M() | overrides |