2012-02-27 36 views
6

Tôi biết có một vài công cụ phân tích tĩnh cho C# hoặc .Net xung quanh. Xem số question để biết danh sách các công cụ có sẵn. Tôi đã sử dụng một số trong những người trong quá khứ và họ có một cách tốt để phát hiện các vấn đề.Công cụ phân tích tĩnh để kiểm tra khóa trước khi truy cập vào biến

Tôi hiện đang tìm cách tự động thực thi một số quy tắc khóa mà chúng tôi có trong nhóm của mình. Ví dụ tôi muốn thực thi các quy tắc sau:

"Mỗi phương pháp nào có sử dụng viên foo phải có một khóa trên thanh" Hoặc "Mỗi cuộc gọi đến foobar sự kiện phải được khóa bên ngoài để thanh "

Viết quy tắc FxCop tùy chỉnh, nếu feasible, có vẻ khá phức tạp. Có cách nào đơn giản hơn để làm điều đó không?

Trả lời

0

Một trong các giải pháp có thể thực hiện là Code Contracts. Bạn xác định quy tắc, chạy chúng tại thời gian biên dịch (vì vậy cũng có thể được tích hợp trong môi trường CI của bạn nếu có) và nhận kết quả.

Đối en ví dụ của việc sử dụng CodeContracts như một công cụ để Nhà phân tích tĩnh đang xem:

Static Code Analysis and Code Contracts

+1

Bạn sẽ viết một hợp đồng cấm truy cập vào một hồ sơ nhất định trừ khi khóa được thực hiện như thế nào? – svick

+0

@svick: khóa không cần thiết có nghĩa là bạn sử dụng 'khóa' tuyên bố. Bạn có thể sử dụng các đối tượng 'sync' khác để có thể kiểm tra xem đối tượng có được báo hiệu/khóa/... không. – Tigran

+0

OK, tuy nhiên, làm cách nào để bạn viết một hợp đồng mã kiểm tra mọi quyền truy cập vào trường? – svick

1

Multithreading khó. Sử dụng khóa không phải là cách duy nhất để thực hiện các thao tác an toàn chỉ. Nhà phát triển có thể sử dụng đồng bộ hóa không chặn với vòng lặp và Interlocked.CompareExchange hoặc một số cơ chế khác thay thế. Quy tắc không thể xác định xem có gì đó an toàn không.

Nếu mục đích của quy tắc là đảm bảo mã chất lượng cao, tôi nghĩ cách tốt nhất để thực hiện việc này là tạo phiên bản an toàn cho chủ đề của lớp học của bạn. Đặt kiểm tra tại chỗ mã đồng bộ hóa phức tạp hơn chỉ được sửa đổi dưới dạng xem xét mã bởi các nhà phát triển hiểu đa luồng.

+0

"Đặt kiểm tra tại chỗ mã đồng bộ hóa phức tạp hơn chỉ được sửa đổi dưới dạng xem xét mã bởi nhà phát triển hiểu đa luồng": Trên thực tế, đó chính xác là những gì chúng tôi đang cố gắng tự động hóa, bởi vì hiện tại chúng tôi không có quy trình/lưu lượng/nhân lực để xác thực từng sửa đổi. Chúng tôi không cố gắng thực thi tính chính xác, chỉ cần đảm bảo các lỗi rõ ràng không bị trượt qua. –

1

Với NDepend bạn có thể viết một code rule over a LINQ query (CQLinq) có thể trông giống:

warnif count > 0 from m in Methods where 
m.IsUsing ("YourNamespace.YourClass.foo") && ( 
    ! m.IsUsing ("YourNamespace.YourClass.bar") || 
    ! m.IsUsing ("System.Threading.Monitor.Enter(Object)".AllowNoMatch()) || 
    ! m.IsUsing ("System.Threading.Monitor.Exit(Object)".AllowNoMatch())) 
select new { m, m.NbLinesOfCode } 

Về cơ bản nó sẽ diêm phương pháp sử dụng lĩnh vực này foo, mà không sử dụng lĩnh vực này thanh, hoặc không gọi Monitor Enter hoặc Exit . Đây không phải là chính xác những gì bạn đang yêu cầu, vì bạn muốn khóa một cách rõ ràng trên thanh, nhưng điều này là đơn giản và khá gần.

Ghi chú rằng bạn cũng có thể viết ...

m.AssignField("YourNamespace.YourClass.foo") 

... để hạn chế một cách sử dụng ghi/lĩnh vực assign cụ thể về foo.

+0

Vì vậy NDepend hoạt động trở lại IL được tạo ra, chứ không phải mã C# tương ứng? Do đó việc xác nhận đối với lớp Monitor. –

+0

Thật vậy Vincent, trong khi NDepend phân tích cú pháp cũng C# cho bình luận và C# Cyclomatic Complexity metric: http://www.ndepend.com/Doc_CI_Inputs.aspx –

Các vấn đề liên quan