CodeQL 文档

错误的动态调用

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

点击查看 CodeQL 代码库中的查询

对使用“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);
    }
}

参考

  • ©GitHub 公司
  • 条款
  • 隐私