Skip to content

Commit 882caf4

Browse files
authored
Merge pull request #7470 from hvitved/csharp/dispatch-join-order
C#: Fix bad join-order in dispatch library
2 parents 0cbf136 + f5471e3 commit 882caf4

File tree

1 file changed

+11
-6
lines changed

1 file changed

+11
-6
lines changed

csharp/ql/lib/semmle/code/csharp/dispatch/Dispatch.qll

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -233,18 +233,23 @@ private module Internal {
233233
}
234234

235235
pragma[noinline]
236-
private predicate hasOverrider(OverridableCallable oc, Gvn::GvnType t) {
236+
private predicate hasOverrider(Gvn::GvnType t, OverridableCallable oc) {
237237
exists(oc.getAnOverrider(any(ValueOrRefType t0 | Gvn::getGlobalValueNumber(t0) = t)))
238238
}
239239

240240
pragma[noinline]
241-
private predicate hasCallable(OverridableCallable source, Gvn::GvnType t, OverridableCallable c) {
241+
private predicate hasCallable0(Gvn::GvnType t, OverridableCallable c, OverridableCallable source) {
242242
c.getUnboundDeclaration() = source and
243243
any(ValueOrRefType t0 | Gvn::getGlobalValueNumber(t0) = t).hasCallable(c) and
244-
hasOverrider(c, t) and
245244
source = any(DispatchMethodOrAccessorCall call).getAStaticTargetExt()
246245
}
247246

247+
pragma[noinline]
248+
private predicate hasCallable(Gvn::GvnType t, OverridableCallable c, OverridableCallable source) {
249+
hasCallable0(t, c, source) and
250+
hasOverrider(t, c)
251+
}
252+
248253
abstract private class DispatchMethodOrAccessorCall extends DispatchCallImpl {
249254
pragma[noinline]
250255
OverridableCallable getAStaticTargetExt() {
@@ -260,7 +265,7 @@ private module Internal {
260265

261266
pragma[noinline]
262267
private predicate hasSubsumedQualifierType(Gvn::GvnType t) {
263-
hasOverrider(_, t) and
268+
hasOverrider(t, _) and
264269
exists(Type t0 |
265270
t0 = getAPossibleType(this.getQualifier(), false) and
266271
not t0 instanceof TypeParameter
@@ -287,7 +292,7 @@ private module Internal {
287292
pragma[nomagic]
288293
predicate hasSubsumedQualifierTypeOverridden(Gvn::GvnType t, OverridableCallable c) {
289294
this.hasSubsumedQualifierType(t) and
290-
hasCallable(any(OverridableCallable oc | oc = this.getAStaticTargetExt()), t, c)
295+
hasCallable(t, c, any(OverridableCallable oc | oc = this.getAStaticTargetExt()))
291296
}
292297

293298
/**
@@ -553,7 +558,7 @@ private module Internal {
553558

554559
pragma[nomagic]
555560
private predicate contextArgHasSubsumedType(DispatchCall ctx, Gvn::GvnType t) {
556-
hasOverrider(_, t) and
561+
hasOverrider(t, _) and
557562
exists(Gvn::GvnType t0 | this.contextArgHasNonTypeParameterType(ctx, t0) |
558563
t = t0
559564
or

0 commit comments

Comments
 (0)