错误的动态调用¶
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
对使用“dynamic”类型声明的变量进行方法调用是在运行时而不是编译时解析的 - 确定实例的实际类型,并尝试在该类型上调用具有适当签名的 方法。如果不存在这样的方法,则会引发 RuntimeBinderException
。
此规则标识对具有 dynamic
类型的实例的调用,其中可以静态确定该调用将引发 RuntimeBinderException
。
建议¶
确保不可能对缺少适当方法签名来处理该调用的类型的动态实例进行调用。
示例¶
在此示例中,程序尝试在没有 Foo
方法的类上调用 Foo
。此程序保证在运行时失败并引发 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);
}
}
参考¶
MSDN:dynamic(C# 参考)。
常见弱点枚举:CWE-628。