【问题标题】:Why CodeContracts Static Analyzer doesn't make warnings?为什么 CodeContracts 静态分析器不发出警告?
【发布时间】:2011-11-18 18:36:32
【问题描述】:

我有几个用户控件,它们订阅了另一个类中的事件处理程序。 我正在学习 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 规则集运行代码分析,也没有警告。 (但我更喜欢处理代码合同并使用合同类执行一些额外的检查,而不是使用 if-then-throw 或其他东西)

【问题讨论】:

  • 您是否启用了“隐式空合同”?

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      我遇到了类似的问题。我不得不在与“隐式非空义务”复选框相同的面板上打开警告级别滑块。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 代码分析 != 代码契约
        猜你喜欢
        • 1970-01-01
        • 2021-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        • 1970-01-01
        • 2021-12-27
        相关资源
        最近更新 更多