CodeQL library for C#
codeql/csharp-all 3.1.1-dev (changelog, source)
Search

Member predicate OperatorCall::getARuntimeTarget

Gets a potential run-time target of this call.

A potential target is a callable that is neither abstract nor defined in an interface.

Unlike getTarget(), this predicate takes reflection/dynamic based calls, virtual dispatch, and delegate calls into account. Example:

class A {
  virtual void M() { }
}

class B : A {
  override void M() { }

  static void CallM(A a) {
    a.M();
    typeof(A).InvokeMember("M", BindingFlags.Public, null, a, new object[0]);
  }
}

class C {
  void M2(Action<int> a) {
    a(0);
  }

  static void CallM2(C c) {
    c.M2(i => { });
  }
}
  • Line 9: The static target is A.M(), whereas the run-time targets are both A.M() and B.M().

  • Line 10: The static target is Type.InvokeMember(), whereas the run-time targets are both A.M() and B.M().

  • Line 16: There is no static target (delegate call) but the delegate i => { } (line 20) is a run-time target.

Operator getARuntimeTarget()