Nếu tôi viết những dòng này:Đây có phải là lỗi trong trình kiểm tra hợp đồng tĩnh không?
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;
}
}
Trình kiểm tra hợp đồng tĩnh có thể chứng minh tất cả khẳng định.
Nhưng nếu tôi viết những dòng này thay vì:
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;
}
}
Nó tuyên bố các hậu owner == null || count > 0
là chưa được chứng minh.
Tôi nghĩ rằng tôi có thể chứng minh hình thức thứ hai không vi phạm hậu điều này:
// { 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
là một cái gì đó sai với bằng chứng của tôi không?
tôi thêm khẳng định trong bằng chứng của tôi như Contract.Assert
cuộc gọi đến các mã, và tôi đi đến kết luận rằng nếu tôi thêm chỉ thế này, nó quản lý để chứng minh hậu:
--count;
Contract.Assert(count == 0 || count > 0)
if (count == 0)
owner = null;
Nhưng, nếu tôi bây giờ thay đổi cùng một xác nhận đó thành một cách "tự nhiên hơn", nó không thành công:
--count;
Contract.Assert(count >= 0)
if (count == 0)
owner = null;
Nó sẽ được kỳ vọng rằng hai xác nhận tương đương, nhưng trình kiểm tra tĩnh xử lý chúng khác nhau.
(Tôi đang sử dụng phiên bản beta 2 của VS10 bằng cách này)
Vì không ai chứng minh tôi sai cho đến nay, tôi sẽ coi đó là lỗi và gửi báo cáo. Bây giờ, tôi có thể làm điều đó ở đâu? Google để giải cứu ... –
Kết nối dường như ghét tôi hoặc kết nối của tôi hoặc Chrome. Tôi sẽ đánh giá cao nếu ai đó báo cáo lỗi này cho tôi ... –