代码合同虚假肯定和压制

我开始使用代码合同,并试图清除错误的肯定警告,其中代码合同不承认依赖项属性可以设置为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