有没有办法在自定义 System.Security.IPermission 实现上修复此 FxCop CA2103 警告?

Posted

技术标签:

【中文标题】有没有办法在自定义 System.Security.IPermission 实现上修复此 FxCop CA2103 警告?【英文标题】:Is there a way to fix this FxCop CA2103 warning on a custom System.Security.IPermission implementaion? 【发布时间】:2012-01-23 18:51:45 【问题描述】:

我有一个实现IPermission的类:

public class MySecurityPermission : IPermission

    private string[] _demandRoles;
    private string[] _denyRoles;

    public MySecurityPermission(string[] demandRoles, string[] denyRoles)
    
        this._demandRoles = demandRoles;
        this._denyRoles = denyRoles;
    

现在,IPermission 接口需要一个Copy() 方法,我将其实现为:

public IPermission Copy()

    return new MySecurityPermission(this._demandRoles.ToArray(), this._denyRoles.ToArray());

请注意,.ToArray() 调用在那里是因为它会关闭/复制数组,并返回一个新的数组实例,而不是传递相同的数组。

这会产生 FxCop CA2103:

“查看以下内容以了解可能的安全漏洞: 在 'MySecurityPermission.Copy()' 中,返回值 调用 'Enumerable.ToArray(this IEnumerable)' 正在传递给 'MySecurityPermission' 构造函数。”

有没有办法“解决”这个问题?我不确定为什么 FxCop 甚至会抱怨它。如果有人能解释一下,那就太好了。

【问题讨论】:

如果您将字段标记为readonly,会发生什么? 为您的阅读乐趣提供更多信息(不确定是否有帮助):msdn.microsoft.com/en-us/library/ms182309(v=vs.100).aspx @vcsjones - 这也是我最初的反应,但该接口还需要一个 FromXML() 方法,我需要在这些数组中基于 XML 设置值,因此它们不能是只读的:( 【参考方案1】:

似乎由于代码的执行位置而引发了规则。如果您先创建变量,则规则将通过:

public IPermission Copy()

    var demand = _demandRoles.ToArray();
    var deny = _denyRoles.ToArray();
    return new MySecurityPermission(demand, deny);

【讨论】:

啊,好电话。我开始尝试自己修复它,方法是手动将Array.Copy() 放入一个新变量中,然后将其传递给构造函数。这似乎也有效,但您的解决方案更容易。我很惊讶 FxCop 看到了不同。我本来希望 IL 代码大致相同。谢谢!

以上是关于有没有办法在自定义 System.Security.IPermission 实现上修复此 FxCop CA2103 警告?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在自定义继承过程中使用字段执行计算?

调用微信退款接口时,证书验证出现System.Security.Cryptography.CryptographicException: 出现了内部错误 解决办法

在自定义视图中获取android attr

在自定义 JSON 堆栈中传递敏感信息

在自定义模板中动态添加多个剑道下拉列表

调用微信退款接口时出现System.Security.Cryptography.CryptographicException: 出现了内部错误 解决办法