2010-06-01 67 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