अगर मैं यह लिख:क्या यह स्थिर अनुबंध चेकर में एक बग है?
public sealed class Foo
{
private int count;
private object owner;
private void Bar()
{
Contract.Requires(count > 0);
Contract.Ensures(owner == null || count > 0);
if (count == 1)
owner = null;
--count;
}
}
स्थिर अनुबंध चेकर गए सभी दावे को साबित कर सकते हैं।
लेकिन अगर मैं इस बजाय लिखें:
public sealed class Foo
{
private int count;
private object owner;
private void Bar()
{
Contract.Requires(count > 0);
Contract.Ensures(owner == null || count > 0);
--count;
if (count == 0)
owner = null;
}
}
उसका दावा है postcondition owner == null || count > 0
अप्रमाणित है।
मुझे लगता है कि मैं साबित कर सकते हैं दूसरा रूप यह postcondition का उल्लंघन नहीं करता:
// { count > 0 } it's required
--count;
// { count == 0 || count > 0 } if it was 1, it's now zero, otherwise it's still greater than zero
if (count == 0)
{
// { count == 0 } the if condition is true
owner = null;
// { count == 0 && owner == null } assignment works
}
// { count == 0 && owner == null || count != 0 && count > 0 } either the if was entered or not
// { owner == null || count > 0 } we can assume a weaker postcondition
कुछ मेरी सबूत के साथ कुछ गलत है?
मैं कोड को Contract.Assert
कॉल के रूप में मेरे सबूत में दावे जोड़ा, और मैं निष्कर्ष पर पहुंचा है, तो मैं सिर्फ इस एक जोड़ने के लिए, यह postcondition साबित करने के लिए प्रबंधन करता है कि: अगर मैं,
--count;
Contract.Assert(count == 0 || count > 0)
if (count == 0)
owner = null;
लेकिन अब बदल है कि एक "और अधिक प्राकृतिक" जिस तरह से करने के लिए एक ही जोर है, यह विफल रहता है:
--count;
Contract.Assert(count >= 0)
if (count == 0)
owner = null;
यह अपेक्षा की जाती है कि उन दो कथनों बराबर थे, लेकिन स्थिर चेकर उन्हें अलग तरह से व्यवहार करता है।
(मैं जिस तरह से VS10 का बीटा 2 का उपयोग कर रहा)
चूंकि किसी ने मुझे अब तक गलत साबित नहीं किया है, इसलिए मैं इसे एक बग के रूप में ले जाऊंगा और एक रिपोर्ट दर्ज करूंगा। अब, मैं यह कहां कर सकता हूं? बचाव के लिए Google ... –
कनेक्ट मुझसे नफरत करता है, या मेरा कनेक्शन, या क्रोम। अगर कोई मेरे लिए इस बग की रिपोर्ट करेगा तो मैं इसकी सराहना करता हूं ... –