2016-04-04 15 views
5

Tôi có một đoạn mã mà trông một chút như thế này:CC Đề xuất Redundant Đảm bảo

public TReturn SubRegion(TParam foo) 
{ 
    Contract.Requires(foo!= null); 
    Contract.Ensures(Contract.Result<TReturn>() != null); 

    if (!CheckStuff(foo)) 
     foo.Blah(); 
    return OtherStuff(foo); 
} 

CC là đem lại cho tôi một lời cảnh báo:

Cảnh báo 301 CodeContracts: Hãy xem xét thêm các hợp đồng hậu. Đảm bảo (Contract.Result()! = Null); để cung cấp tài liệu bổ sung cho khách hàng thư viện

Rõ ràng là hoàn toàn dư thừa! Tôi có một số cảnh báo dư thừa như vậy và nó trở thành một vấn đề (cảnh báo thực sự bị chôn vùi trong một loạt các đề xuất dư thừa).

Vì vậy, tôi có hai câu hỏi:

1) Tôi có thiếu điều gì đó có nghĩa đây không phải là đề xuất dự phòng không? Trong trường hợp nào tôi cần phải làm gì để khắc phục cảnh báo này?

2) Ngoài ra, nếu điều này chỉ là một quirk của CCCheck và không thể được cố định làm thế nào tôi có thể ẩn hoặc ngăn chặn cảnh báo này?

N.b. Chỉ trong trường hợp bạn cho rằng ví dụ của tôi thiếu một cái gì đó quan trọng, mã đầy đủ là phương thức SubRegionhere.

+2

Bạn đang sử dụng phiên bản mã nào? –

+1

Nhìn vào mã của bạn, tôi nghĩ rằng vấn đề là tiếp tục xuống dòng. Trong 'SubRegion' có một cuộc gọi đến' ConstructFromSlicePart', mà lần lượt có một cuộc gọi đến 'Construct (hình dạng IReadOnlyList )'. Bên trong 'Construct' dòng cuối cùng là' return default (TSection) '. Nếu 'TSection' là một kiểu tham chiếu, thì phương thức sẽ trả về null. Đây có thể là nguyên nhân, mà cuối cùng là biểu hiện chính nó như là cảnh báo này. –

+0

Phiên bản CC là 1.9.10714.2 - theo như tôi có thể thấy đó là mới nhất. re: phương pháp xây dựng, bạn có chắc là bạn không nhìn vào lớp hợp đồng? Việc triển khai thực sự duy nhất của Construct là: https://bitbucket.org/martindevans/base-citygeneration/src/0128578a6228487ac3d98398bf0c8ed8bb43d0f5/Base-CityGeneration/Elements/Building/Internals/Floors/Design/Region.cs?at=default&fileviewer=file -view-default # Region.cs-34 rõ ràng không bao giờ trả về null! – Martin

Trả lời

1

Về 2: documentation là khá tốt, hãy nhìn vào 6.6.10 Lọc tin nhắn cảnh báo:

Để hướng dẫn các kiểm tra hợp đồng tĩnh không phát ra một lớp học đặc biệt cảnh báo cho một phương pháp (một loại, một lắp ráp), chú thích phương pháp (các loại, lắp ráp) với các thuộc tính:

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Contracts", warningFamily)] 

nơi warningFamily là một trong số: Requires, Ensures, Invariant, NonNull, ArrayCreation, ArrayLowerBound, ArrayUpperBound, DivByZero, MinValueNegation.

Nếu cần, trình kiểm tra hợp đồng tĩnh cho phép lọc một thông điệp cảnh báo duy nhất (thay vì cả gia đình). Để làm như vậy bạn có thể chú thích một phương pháp với các thuộc tính

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Contracts", warningFamily-ILOffset-MethodILOffset)] 

nơi warningFamily là như trên, và ILOffsetMethodILOffset được sử dụng bởi các kiểm tra hợp đồng tĩnh để xác định điểm chương trình cảnh báo đề cập đến. Có thể lấy số bù từ bộ kiểm tra hợp đồng tĩnh bằng cách cung cấp công tắc -outputwarnmasks trong mục "Tùy chọn tùy chỉnh" trong ngăn VS. Kiểm tra cửa sổ xây dựng đầu ra cho các thông tin cần thiết .

+1

Có vẻ như không ai có bất kỳ ý tưởng nào về # 1, vì vậy tôi đoán điều này có câu trả lời được chấp nhận! – Martin