为什么CodeContracts静态分析器不会发出警告?

时间:2011-11-18 18:36:32

标签: c# c#-4.0 code-contracts contracts

我有几个用户控件,它们在另一个类中订阅了事件处理程序。 我正在学习C#中的CodeContracts,我想知道,为什么Static Analyzer允许编写这样的代码:

void MyUserControl_MouseEnter(object sender, MouseEventArgs e)
{
  MyUserControl item = sender as MyUserControl;      
  item.DoSomething(); // I expect some warning here, because item can be null

  sender.Equals(testObject); // This doesn't yield warning either 
}

这里我有一个可能不安全的代码,可能导致空引用异常。 我明白,静态分析器可能无法检查,sender的实际类型是什么。但是如果它无法证明它,我希望有一些警告,比如CodeContracts: Possibly calling a method on a null reference

或者我对合同错误有所了解?如何收到此类错误的通知?

UPD:

是的,我确实按照答案中的建议启用了Implicit Non-Null Obligation,但我仍然没有收到Static Analyzer的警告。此外,我尝试使用Microsoft All Rules规则集运行代码分析,也没有警告。 (但我更喜欢处理Code Contracts并使用Contract类执行一些额外的检查,而不是使用if-then-throw或其他东西)

4 个答案:

答案 0 :(得分:3)

您应该在静态分析器选项(项目选项|代码分析)中启用“隐式非空义务”。

答案 1 :(得分:0)

“我怎样才能收到这样的错误通知?”:Resharper会在这种情况下发出警告。

代码合同将警告您,如果“Requires”表示对象为非null,则该对象可能为null。你要求对象取消引用隐含的“要求”,从表面来看似乎是合理的,但无论出于何种原因,CC似乎都没有提供。

http://msdn.microsoft.com/en-us/library/dd264808.aspx处的文档说它确实执行了这样一个隐含的合同。我正在进一步研究它。

RedHat打败了我。更多详细信息:您应该检查项目属性的“代码合同”选项卡中“静态检查”下的“隐式非空义务”框。

答案 2 :(得分:0)

我有类似的问题。我不得不在“Implicit Non-Null obligation”复选框的同一面板上调高警告级别滑块。

答案 3 :(得分:-1)

代码分析标签上项目的属性页面中,您可以更改规则