Skip to content

Commit 73c6d89

Browse files
committed
C#: Update the dispatch logic to account for all instance operator calls.
1 parent 244bbb3 commit 73c6d89

1 file changed

Lines changed: 18 additions & 7 deletions

File tree

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

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,19 @@ class DispatchCall extends Internal::TDispatchCall {
7373
}
7474
}
7575

76+
abstract private class InstanceOperatorCall extends OperatorCall {
77+
abstract Expr getQualifier();
78+
}
79+
80+
private class InstanceCompoundAssignment extends InstanceOperatorCall instanceof CompoundAssignmentOperatorCall
81+
{
82+
override Expr getQualifier() { result = CompoundAssignmentOperatorCall.super.getQualifier() }
83+
}
84+
85+
private class InstanceMutator extends InstanceOperatorCall instanceof InstanceMutatorOperatorCall {
86+
override Expr getQualifier() { result = InstanceMutatorOperatorCall.super.getQualifier() }
87+
}
88+
7689
/** Internal implementation details. */
7790
private module Internal {
7891
private import OverridableCallable
@@ -101,9 +114,9 @@ private module Internal {
101114
} or
102115
TDispatchOperatorCall(OperatorCall oc) {
103116
not oc.isLateBound() and
104-
not oc instanceof CompoundAssignmentOperatorCall
117+
not oc instanceof InstanceOperatorCall
105118
} or
106-
TDispatchCompoundAssignmentOperatorCall(CompoundAssignmentOperatorCall caoc) or
119+
TDispatchInstanceOperatorCall(InstanceOperatorCall caoc) or
107120
TDispatchReflectionCall(MethodCall mc, string name, Expr object, Expr qualifier, int args) {
108121
isReflectionCall(mc, name, object, qualifier, args)
109122
} or
@@ -890,12 +903,10 @@ private module Internal {
890903
override Operator getAStaticTarget() { result = this.getCall().getTarget() }
891904
}
892905

893-
private class DispatchCompoundAssignmentOperatorCall extends DispatchOverridableCall,
894-
TDispatchCompoundAssignmentOperatorCall
906+
private class DispatchInstanceOperatorCall extends DispatchOverridableCall,
907+
TDispatchInstanceOperatorCall
895908
{
896-
override CompoundAssignmentOperatorCall getCall() {
897-
this = TDispatchCompoundAssignmentOperatorCall(result)
898-
}
909+
override InstanceOperatorCall getCall() { this = TDispatchInstanceOperatorCall(result) }
899910

900911
override Expr getArgument(int i) { result = this.getCall().getArgument(i) }
901912

0 commit comments

Comments
 (0)