Skip to content

Commit 8c59631

Browse files
committed
C#: Use the first getter/setter when calling a property (override can apply to only a getter or a setter).
1 parent 518eb9e commit 8c59631

2 files changed

Lines changed: 18 additions & 4 deletions

File tree

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,20 @@ class DeclarationWithGetSetAccessors extends DeclarationWithAccessors, TopLevelE
5757
/** Gets the `set` accessor of this declaration, if any. */
5858
Setter getSetter() { result = this.getAnAccessor() }
5959

60+
/** Gets the target `get` accessor of this declaration, if any. */
61+
Getter getFirstGetter() {
62+
if exists(this.getGetter())
63+
then result = this.getGetter()
64+
else result = this.getOverridee().getFirstGetter()
65+
}
66+
67+
/** Gets the target `set` accessor of this declaration, if any. */
68+
Setter getFirstSetter() {
69+
if exists(this.getSetter())
70+
then result = this.getSetter()
71+
else result = this.getOverridee().getFirstSetter()
72+
}
73+
6074
override DeclarationWithGetSetAccessors getOverridee() {
6175
result = DeclarationWithAccessors.super.getOverridee()
6276
}

csharp/ql/lib/semmle/code/csharp/exprs/Call.qll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -762,11 +762,11 @@ class AccessorCall extends Call, QualifiableExpr, @call_access_expr {
762762
*/
763763
class PropertyCall extends AccessorCall, PropertyAccessExpr {
764764
override Accessor getReadTarget() {
765-
this instanceof AssignableRead and result = this.getProperty().getGetter()
765+
this instanceof AssignableRead and result = this.getProperty().getFirstGetter()
766766
}
767767

768768
override Accessor getWriteTarget() {
769-
this instanceof AssignableWrite and result = this.getProperty().getSetter()
769+
this instanceof AssignableWrite and result = this.getProperty().getFirstSetter()
770770
}
771771

772772
override Expr getArgument(int i) {
@@ -797,11 +797,11 @@ class PropertyCall extends AccessorCall, PropertyAccessExpr {
797797
*/
798798
class IndexerCall extends AccessorCall, IndexerAccessExpr {
799799
override Accessor getReadTarget() {
800-
this instanceof AssignableRead and result = this.getIndexer().getGetter()
800+
this instanceof AssignableRead and result = this.getIndexer().getFirstGetter()
801801
}
802802

803803
override Accessor getWriteTarget() {
804-
this instanceof AssignableWrite and result = this.getIndexer().getSetter()
804+
this instanceof AssignableWrite and result = this.getIndexer().getFirstSetter()
805805
}
806806

807807
override Expr getArgument(int i) {

0 commit comments

Comments
 (0)