为什么CodeContracts静态分析器不会发出警告?
我有几个用户控件,订阅了另一个类中的事件处理程序。 我在C#中学习CodeContracts,我想知道为什么静态分析器允许编写如下代码:
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
正如答案中所建议的那样,但我仍然没有从静态分析器收到警告。 此外,我尝试运行代码分析与Microsoft All Rules
规则集,也没有警告。 (但我更愿意处理代码合同,并使用Contract类执行一些额外的检查,而不是使用if-then-throw或其他方法)
您应该在静态分析器选项(项目选项|代码分析)中启用“隐式非空义务”。
“我怎样才能得到像这样的错误通知?”:在这种情况下,Resharper会警告你。
代码合约会警告你,如果有一个“需要”对象是非空的,该对象可能为空。 你需要一个隐含的“需求”来解决对象的废弃问题,这在表面上似乎是合理的,但是无论出于何种原因,哪个CC似乎都没有提供。
http://msdn.microsoft.com/en-us/library/dd264808.aspx上的文档说它确实执行了这种隐式合同。 我正在进一步研究。
RedHat击败了我。 更多详细信息:您应该检查项目属性的代码合同选项卡中的“静态检查”下的“隐式非空义务”框。
我有类似的问题。 我必须在与“隐式非空义务”复选框相同的面板上打开警告级别滑块。
链接地址: http://www.djcxy.com/p/23739.html上一篇: Why CodeContracts Static Analyzer doesn't make warnings?
下一篇: CodeContracts issue