Bad dynamic call¶
ID: cs/invalid-dynamic-call
Kind: problem
Security severity:
Severity: error
Precision: medium
Tags:
- reliability
- correctness
- logic
- external/cwe/cwe-628
Query suites:
- csharp-security-and-quality.qls
Click to see the query in the CodeQL repository
Method calls on variables declared with type ‘dynamic’ are resolved at runtime rather than compile-time - the actual type of the instance is determined, and an attempt is made to call a method on that type with the appropriate signature. If such a method does not exist, a RuntimeBinderException
is thrown.
This rule identifies calls to instances with the dynamic
type where it can be statically determined that the call will throw a RuntimeBinderException
.
Recommendation¶
Ensure it is not possible to make a call to a dynamic instance of a type that lacks the appropriate method signature for handling that call.
Example¶
In this example the program attempts to call Foo
on a class that doesn’t have a Foo
method. This program is guaranteed to fail at runtime with a RuntimeBinderException
.
class BadDynamicCall
{
class WithFoo
{
public void Foo(int i) { }
}
class WithoutFoo { }
public static void Main(string[] args)
{
dynamic o = new WithoutFoo();
o.Foo(3);
}
}
References¶
MSDN: dynamic (C# Reference).
Common Weakness Enumeration: CWE-628.