Có an toàn không khi dựa vào phân tích tĩnh đối với các lỗi đồng thời của Google sao chép lại một cách đáng tin cậy?


8

Tôi đã thừa hưởng một số mã Java mà tôi nghi ngờ có một số lỗi đồng thời khi đồng bộ hóa giữa một luồng truy vấn dữ liệu và một sự kiện IO cập nhật cùng một dữ liệu. Tôi đang thử nghiệm một công cụ phân tích tĩnh có tên ThreadSafe thực sự phát hiện các vấn đề tương tranh khác nhau (tức là trường được truy cập từ phương thức được gọi không đồng bộ mà không đồng bộ hóa và đồng bộ hóa truy cập không nhất quán vào bộ sưu tập).

Sau khi phát hiện ra việc tạo ra các cuộc đua dữ liệu khó khăn như thế nào bằng cách viết các bài kiểm tra đơn vị, tôi tự hỏi liệu có nên phụ thuộc vào ThreadSafe để "tái tạo" các lỗi một cách đáng tin cậy không? Điều tôi đang hỏi là, có an toàn không khi phụ thuộc vào công cụ phân tích tĩnh để cho tôi biết khi tôi sửa lỗi? (Tất nhiên, để sửa lỗi tôi sẽ cần hiểu từng lỗi trong ngữ cảnh).



6
Vì vậy, nói cách khác, câu hỏi của bạn là "phân tích tĩnh có phủ định sai không".

@delnan: TUYỆT VỜI, nhận xét sâu sắc. +100 nếu tôi có thể.
John R. Strohm

Câu trả lời:


3

Trả lời câu hỏi đầu tiên của bạn:

http://www.contemplateltd.com/threadsafe/faq#non-checkers

"Những loại khiếm khuyết đồng thời mà ThreadSafe không tìm kiếm?

  • Chúng tôi chưa bao gồm hỗ trợ cho tất cả java.util.conc hiện. Cụ thể, ThreadSafe không kiểm tra việc sử dụng sai các tiện ích đồng bộ hóa nâng cao được cung cấp bởi java.util.concản, ví dụ như gói java.util.concản.atomic. Hiện tại nó cũng không bao gồm bất kỳ trình kiểm tra nào cho các lỗi có thể xảy ra khi viết các chương trình song song bằng cách sử dụng khung Fork-Join.

  • Tìm lỗi trong các thuật toán không khóa phức tạp đòi hỏi công nghệ phân tích không có quy mô tốt. Các thuật toán như vậy nên để lại cho các chuyên gia đồng thời chuyên ngành. ThreadSafe có thể được cấu hình để tìm lỗi trong các ứng dụng sử dụng các thư viện chứa các thuật toán đó.

  • Những phân tích mà chúng tôi đưa vào trong các bản phát hành mới của ThreadSafe được quyết định bởi cả những gì có thể sử dụng công nghệ phân tích đủ trưởng thành để tích hợp vào một sản phẩm có thể sử dụng và bởi các tính năng và khiếm khuyết đồng thời mà chúng ta thường thấy trong các chương trình Java 'trung bình'.

  • Nếu bạn gặp vấn đề tương tranh Java hiện chưa được xử lý bởi ThreadSafe, các chuyên gia đồng thời Java của Contemplate có thể giúp đỡ bằng cách thêm cấu hình tùy chỉnh vào ThreadSafe và / hoặc sử dụng công nghệ phân tích nâng cao chưa đủ chín muồi để tích hợp vào ThreadSafe. "


1
Lưu ý đến bản thân: RTFM! Điều này trả lời câu hỏi của tôi.
doughgle

8

Theo kinh nghiệm của tôi, một nhà phát triển xác định, có ý nghĩa, nhưng không biết gì có thể bao bọc đủ sự xáo trộn xung quanh một lỗi đồng thời mà công cụ phân tích sẽ bỏ lỡ.

Nếu công cụ cho rằng có lỗi, giả sử nó đúng cho đến khi bạn chứng minh khác. Đó là giá trị của công cụ. Nếu công cụ không tìm thấy bất kỳ lỗi nào, cách tốt nhất của bạn là giả vờ công cụ không tồn tại.

Nếu bạn muốn mã đồng thời đáng tin cậy (bằng bất kỳ ngôn ngữ nào), mục tiêu của bạn nên bao gồm:

  1. Các phần quan trọng nên nhỏđơn giản để chúng không đáng để hiểu.
  2. Các phần quan trọng nên được cách ly hoàn toàn với mã khác ở cấp nguồn.
  3. Một hàm / phương thức / chương trình con liên quan đến mã đồng thời chỉ nên làm một việc . Nếu nó thao túng một nguyên thủy đồng bộ hóa (khóa, semaphore, v.v.) thì nó KHÔNG nên sử dụng bất kỳ tài nguyên được chia sẻ nào và nó KHÔNG được chứa các vòng lặp hoặc mã có điều kiện. Di chuyển "công việc thực tế" sang một chức năng riêng biệt. Điều này hỗ trợ mục 1.
  4. Nếu bạn có bất kỳ loại khóa nào, nhà phát triển sẽ có thể đọc mã và xác định chính xác (các) tài nguyên mà khóa đó bảo vệ trong 30 giây hoặc ít hơn. Nếu điều đó không rõ ràng với bạn, điều đó sẽ không rõ ràng với chàng trai tiếp theo. Và nó có thể không rõ ràng với những người đã viết mã. Vì vậy, nó có thể bị hỏng.
  5. Khả năng hiển thị của tài nguyên bạn đang bảo vệ không được lớn hơn khả năng hiển thị của nguyên thủy đồng bộ hóa bảo vệ tài nguyên đó. Không phải thành phần nào cũng có thể nhìn thấy đối với phần mã lớn hơn.
  6. V.v. Phần còn lại của danh sách thực sự chỉ là một loạt các cách để nghỉ ngơi các mục 1 và 2.

Nếu mã của bạn được thiết kế và tổ chức đúng, bạn sẽ có thể nhìn vào một phần rất nhỏ của mã để hiểu và tin tưởng vào sự tương tranh. Khi bạn đạt được mục tiêu đó , sau đó cung cấp mã cho công cụ phân tích tĩnh và xem liệu nó có đồng ý không.

Và đưa mã cho một vài nhà phát triển không phải là guru khác để xem xét. Yêu cầu họ giải thích cách hoạt động của đồng thời và tại sao nó đúng. Nếu họ không thể giải thích nó, nó vẫn quá phức tạp.


2
một cái gì đó để thêm vào 4: mỗi tài nguyên được bảo vệ bởi một khóa phải được ghi lại rằng nó được bảo vệ bởi khóa và không bao giờ được sử dụng từ nơi có được khóa
ratchet freak

1
Một cái gì đó để thêm: 6) KHÔNG BAO GIỜ có được và giữ nhiều hơn một khóa tại bất kỳ thời điểm nào. 7) Nếu bạn hoàn toàn, tích cực PHẢI có được và giữ nhiều hơn một khóa tại bất kỳ thời điểm nào, hãy chắc chắn rằng họ LUÔN LUÔN có được theo thứ tự CÙNG. Nếu cả quy trình A và quy trình B đều phải có được các khóa Đỏ và Xanh lục, chúng có thể bế tắc nếu một trong hai mua lại Đỏ trước và các thứ khác mua được Xanh trước.
John R. Strohm

2

Sản xuất một công cụ phân tích tĩnh hữu ích liên quan đến việc cân bằng một số mối quan tâm xung đột, bao gồm ít nhất là sau đây:

  • Tỷ lệ dương tính giả (báo động sai)
  • Tỷ lệ âm tính (lỗi chưa phát hiện)
  • Thời gian chạy và khả năng mở rộng

Dương tính giả là một mối quan tâm quan trọng với các công cụ phát hiện lỗi vì chúng lãng phí thời gian của nhà phát triển. Có thể loại bỏ âm tính giả, nhưng đối với nhiều loại lỗi, bao gồm cả lỗi đồng thời, điều này sẽ liên quan đến sự gia tăng không thể chấp nhận được trong tỷ lệ dương tính giả. Tỷ lệ của cả dương tính giả và âm tính giả có thể được giảm với chi phí tăng thời gian chạy, nhưng các kỹ thuật phân tích chính xác nhất không vượt quá các ứng dụng nhỏ, và dù sao cả hai đều không thể giảm xuống bằng không.

Các công cụ phân tích động thường yêu cầu tỷ lệ dương tính giả là 0%, nhưng đó là vì họ chỉ tìm thấy lỗi một khi chúng thực sự xảy ra. Đối với một điều kiện cuộc đua hoặc bế tắc chỉ xảy ra một lần trong một mặt trăng xanh, điều đó không hữu ích lắm.

Vì những lý do này, ThreadSafe không hứa sẽ tìm thấy tất cả các lỗi đồng thời - nó nhằm mục đích tìm ra những lỗi quan trọng nhất, với tỷ lệ dương tính giả thấp. Một số người dùng đã thử dùng ThreadSafe trên mã với một lỗi đồng thời đã biết mà họ mất nhiều ngày để tìm và phát hiện ra rằng nó tìm thấy lỗi đó - và thường là các lỗi chính hãng khác mà họ không biết - không có lỗi tích cực trong vài phút.

Một nơi tốt để bắt đầu thông tin về ThreadSafe là bài viết InfoQ này . Để biết thêm, hãy xem trang web ThreadSafe nơi bạn có thể đăng ký dùng thử miễn phí.

(Tiết lộ: ThreadSafe là một công cụ thương mại và tôi là người đồng sáng lập của Contemplate, công ty sản xuất nó.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.