2010-06-01 52 views
21

当使用代码分析和组合代码契约,我得到了很多的警告一样可以让代码分析了解代码合同吗?

CA1062:Microsoft.Design:在外部可见的方法“Foo.Bar(日志)”,使用它之前验证参数“登录” 。

在Foo.Bar中,我有一个合同验证log

public Bar(Log log) 
{ 
    Contract.Requires(log != null); 
    log.Lines.Add(...); 
    // ... 
} 

有没有办法让FxCop了解代码合同?

+0

我希望你可以写一个FxCop插件来完成这项工作。 – GaTechThomas 2010-06-08 16:01:51

+1

Terje Sandstrom有一个很棒的博客文章可以回答这个问题:http://geekswithblogs.net/terje/archive/2010/10/14/making-static-code-analysis-and-code-contracts-work-together-or。 aspx – 2010-12-10 07:18:21

+0

@AngericoCariño我已经更新了上面提到的一些关于这个问题解决方法的新信息。 – 2012-02-19 22:17:44

回答

14

不,我不认为这是可能的,因为合同重写器生成的代码不会产生FxCop正在寻找的标准模式。

虽然我在使用代码合同时禁用了这个特定的FxCop规则。我发现静态验证器不仅弥补了这个规则的损失,还会因为缺乏比FxCop更积极的检查而大喊大叫。我会在这里建议相同的方法,这将为您解决这个问题。

+3

要实际制作这项工作,您必须执行以下几项任务:1.在代码分析中禁用CA1062 - 2.在项目的代码合同窗格中启用“执行静态合同检查” - ** 3.启用“隐式非空义务” - 4.设置警告级别为“嗨”(重要的是,那是我失踪!)** – 2012-11-08 09:31:59

+0

从框架4.5.2版本开始,可以直接通知代码分析所执行的代码合同。查看下面的答案。 – 2015-07-26 15:55:11

-2

指定ArgumentNullException异常这样的:

public Bar(Log log) 
{ 
    Contract.Requires<ArgumentNullException>(log != null); 
    log.Lines.Add(...); 
    // ... 
} 

的FxCop希望对投ArgumentNullException异常...

+0

这与fxcop和代码分析(溢价和终极)的作品。 – 2010-12-19 13:09:28

+7

这不适用于CA - 使用“Microsoft全部规则”规则集,CA1062仍然会引发警告。 VS 2010 sp1,代码合同1.4.40314.1 – 2011-04-28 17:02:45

+0

任何人在2012年测试CA1062? – felickz 2012-12-19 18:58:50

3

是,as noted in my answer here,作为框架的4.5.2版本(可能是4.5)可以通知代码分析所执行的代码合同。扩展方法和标记属性类必须如下定义:

public static class ContractExtensions { 
    /// <summary>Throws <c>ContractException{name}</c> if <c>value</c> is null.</summary> 
    /// <param name="value">Value to be tested.</param> 
    /// <param name="name">Name of the parameter being tested, for use in the exception thrown.</param> 
    [SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "value")] 
    [SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "name")] 
    [ContractAbbreviator] // Requires Assemble Mode = Standard Contract Requires 
    public static void ContractedNotNull<T>([ValidatedNotNull]this T value, string name) where T : class { 
     Contract.Requires(value != null,name); 
    } 
    } 

/// <summary>Decorator for an incoming parameter that is contractually enforced as NotNull.</summary> 
[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)] 
public sealed class ValidatedNotNullAttribute : global::System.Attribute {} 

其他的细节在我的其他答案。

+1

虽然这是一个很好的解决方案,但它不是“通知代码合同的代码分析”。这是一个聪明的技巧,将所有侵犯行为移到一个地方('ContractedNotNull'方法),并抑制那里的警告。 – BartoszKP 2015-09-14 17:44:30

+0

@BartoszKP:虽然我看到你的观点,但它仍然像鸭子一样走路嘎嘎叫;原谅我,如果我称之为鸭子。 – 2015-09-14 21:02:50