代码合同虚假肯定和压制
我开始使用代码合同,并试图清除错误的肯定警告,其中代码合同不承认依赖项属性可以设置为null,因此标记为不需要条件检查。 我试图设置Contract.Assumes,但似乎强制执行只有空情况,并忽略非null情况,导致它错过了第二个合同问题。
我该如何向合约提出建议:无效和无效的情况都是需要检查的可能性?
我也想过只是压制错误,但合同分析的输出信号设置并没有给我提供适当的信息来压制。 它只返回“warning:CodeContracts:warning:布尔条件this.Other!= null总是计算为一个常量值,如果它(或它的否定)出现在源代码中,你可能会有一些死代码或冗余检查”但这没有所需的CheckId值。 如果我无法优雅地解决这个问题,我可以在哪里得到正确的CheckId代码?
编辑:我仍然没有看到一个CheckId,但我确实在输出日志中找到正确的抑制。 抑制票据不符合我的预期,但在上面。 我已经用正确的压制更新了问题代码。 我仍然认为这是一个最后的手段,但至少这是一个选择。
using System;
using System.Diagnostics.Contracts;
using System.Linq;
using System.Windows;
using System.Windows.Interactivity;
using System.Windows.Input;
using System.Diagnostics.CodeAnalysis;
namespace WpfContractExamples
{
public class ExampleBehavior : Behavior<FrameworkElement>
{
public static readonly DependencyProperty CommandProperty = DependencyProperty.Register("Command", typeof(ICommand), typeof(ExampleBehavior), new UIPropertyMetadata(null));
public ICommand Command { get { return (ICommand)GetValue(CommandProperty); } set { SetValue(CommandProperty, value); } }
public static readonly DependencyProperty OtherProperty = DependencyProperty.Register("Other", typeof(string), typeof(ExampleBehavior), new UIPropertyMetadata("Anything"));
public InputGesture Other { get { return (InputGesture)GetValue(OtherProperty); } set { SetValue(OtherProperty, value); } }
[SuppressMessage("Microsoft.Contracts", "TestAlwaysEvaluatingToAConstant", Justification = "Command can be null from binding")]
void AssociatedObject_PreviewKeyDown(object sender, KeyEventArgs e)
{
//Contract.Assume(Command == null);
if (Other.Matches(sender, e) && Command != null)
{
if(Other != null)
Console.WriteLine("Not Null");
}
}
}
}
链接地址: http://www.djcxy.com/p/23747.html
上一篇: Code Contract False Positive and Suppression
下一篇: Proving post conditions for code that does not implement Code Contracts