2012-05-06 27 views
5

Giả sử có hai phương pháp trong thư viện của tôi:Công cụ phân tích tĩnh nào để sử dụng để quét luồng dữ liệu từ phương thức này sang phương pháp khác?

void com.somepackage.SomeClass.someSink(String s)

int com.someotherpackage.SomeOtherClass.someSource(int i)

Phương pháp đầu tiên được sử dụng như một bồn rửa dữ liệu, trong khi thứ hai như là một nguồn dữ liệu trong mã của tôi . Các tham số kiểu int, String chỉ được đưa ra làm ví dụ và có thể thay đổi trong tình huống thực tế.

Tôi muốn phát hiện việc sử dụng các phương pháp này trong một số mã đáp ứng một khuôn mẫu nhất định đưa ra dưới đây:

  1. một số dữ liệu (chẳng hạn x) được tạo ra bởi các nguồn
  2. một số dữ liệu (chẳng hạn y) được tạo bằng cách sử dụng một loạt các biến đổi f1(f2(... fn(x))
  3. y được cấp cho bồn rửa.

Biến đổi có thể là bất kỳ chức năng tùy ý nào miễn là có một chuỗi các cuộc gọi từ hàm tạo dữ liệu cho bồn rửa đến một hàm lấy dữ liệu từ nguồn. Các hàm cũng có thể lấy bất kỳ tham số nào khác và được sử dụng như một hộp đen.

Quá trình quét có thể ở cấp nguồn hoặc bytecode. Các công cụ có sẵn cho loại phân tích này là gì?

Ưu tiên các công cụ không dựa trên IDE với API Java.

[EDIT:] để làm rõ thêm, someSinksomeSource là các tên phương thức tùy ý trong các lớp SomeSomeSomeOtherClass tương ứng. Chúng có thể hoặc không thể là static và có thể mất số lượng thông số tùy ý (mà tôi có thể xác định). Loại tham số cũng không tùy ý. Yêu cầu duy nhất là công cụ sẽ quét mã số và số dòng đầu ra nơi mẫu xuất hiện. Vì vậy, công cụ có thể hoạt động theo cách này:

  • Lấy bồn rửa và tên nguồn (tên đầy đủ của tên lớp và tên phương pháp) từ người dùng.
  • Quét mã tĩnh một cách tĩnh và tìm tất cả các địa điểm nơi bồn rửa và nguồn đã cho được sử dụng
  • Kiểm tra xem đường dẫn có tồn tại ở đâu một số dữ liệu được cung cấp trực tiếp hoặc gián tiếp thông qua một loạt các thao tác).
  • Bỏ qua các nguồn/bồn rửa không có đường dẫn như vậy và xuất ra các đường còn lại (nếu có).

Ví dụ đầu ra:

MyClass1.java:12: value1 = com.someotherpackage.SomeOtherClass.someSource(...) 
MyClass2.java:23: value2 = foo(value1, ...) 
MyClass3.java:3: value3 = bar(value2) 
MyClass4.java:22: com.somepackage.SomeClass.someSink(value3, ...) 

Lưu ý: Nếu một hàm không mất các thông số nhưng có một số tác dụng phụ trên các dữ liệu cũng cần phải được xem xét. (Ví dụ a = source(); void foo(){ c = a+b }; foo(); sink(c) là một mẫu cần được ghi lại.)

+0

Bạn đang mô tả sơ đồ trình tự UML là gì? Nếu có, thì có rất nhiều công cụ (chủ yếu là thương mại) để làm điều này. – mazaneicha

+0

Đây là một tập con của sơ đồ trình tự đáp ứng các tiêu chí 'phụ thuộc dữ liệu'. – Jus12

+0

Vì vậy, tất cả những gì bạn thực sự muốn là lớp thứ hai có một số phụ thuộc dữ liệu gián tiếp vào lần đầu tiên? –

Trả lời

3

Sau khi thực hiện một số nghiên cứu, tôi thấy rằng soot là cách phù hợp nhất cho loại nhiệm vụ này. Soot trưởng thành hơn so với các giải pháp thay thế nguồn mở khác như PQL.

2

Vì vậy, vai trò của phương pháp nguồn và chìm đơn giản là x bắt nguồn trong phương thức nguồn (ở đâu đó) và được tiêu thụ (ở đâu đó) trong phương pháp đích? Làm thế nào để bạn mô tả "x", hay bạn chỉ đơn giản muốn tất cả x có thuộc tính này?

Giả sử bạn đã xác định được x cụ thể trong phương thức nguồn, bạn có a) nhấn mạnh rằng x được chuyển đến phương thức đích chỉ bằng cách gọi phương thức [đó sẽ làm cho phương pháp đích cuộc gọi cuối cùng trong chuỗi cuộc gọi của bạn ], hoặc có thể sao chép một trong các giá trị trung gian? b) nhấn mạnh rằng mỗi cuộc gọi chức năng có chính xác một đối số?

Chúng tôi đã thực hiện một việc như thế này cho các hệ thống C lớn. Vấn đề là để theo dõi một biến được gán vào sử dụng trong các hàm khác, bất kể chúng có thể ở đâu, bao gồm các giá trị không giống nhau trong biểu diễn nhưng giống hệt nhau trong ý định ("abstract abstract"; chuỗi "1.0" tương đương trừu tượng với số nguyên 1 nếu tôi sử dụng chuỗi cuối cùng là một số, "int_to_string" là một "bản sao trừu tượng" chức năng chuyển đổi một giá trị trong một đại diện cho một giá trị tương đương trong một.).

Điều chúng tôi cần cho việc này là phân tích định nghĩa tiếp cận cho từng chức năng ("giá trị từ một nhiệm vụ cụ thể đi đâu?") Và bản sao trừu tượng "" đạt được phân tích xác định nơi giá trị tiếp cận được tiêu thụ đặc biệt các chức năng được gắn thẻ là "bản sao trừu tượng" và nơi kết quả của chức năng sao chép abstact đó đạt tới. Sau đó, một đóng cửa transitive của "x đạt z" và "x đạt f (x) đạt z" tính nơi x có thể đi.

Chúng tôi đã làm điều này bằng DMS Software Reengineering Toolkit của chúng tôi, cung cấp phân tích chung chung và chảy máy móc thiết bị phân tích, và DMS của C Front End, mà thực hiện các sâu rộng và trừu tượng sao chép rộng tính toán cho C. DMS có Java Front End mà tính định nghĩa đạt cụ thể; người ta sẽ thêm logic tiếp cận bản sao abstact và triển khai lại mã đóng cửa chuyển tiếp.

+0

Mỗi hàm được gọi có thể có bất kỳ số tham số nào. Kiểu trả về cũng có thể là bất cứ thứ gì. Tôi đã cập nhật câu hỏi của mình. Xin vui lòng cho tôi biết nếu điều này làm rõ nó. – Jus12

+0

Có cách nào thay thế cho bộ công cụ DMS không? Tốt hơn là một cái gì đó mã nguồn mở. – Jus12

+0

Vâng, có API trình biên dịch Java và có Wala. Đây có thể có một số khả năng phân tích lưu lượng. Nhưng tôi nghĩ bạn muốn phân tích dòng chảy qua các phương thức trong các lớp học, và tôi không chắc họ hỗ trợ bao nhiêu cho việc đó. Tôi cung cấp DMS bởi vì nó là những gì tôi biết, và bởi vì chúng tôi đã nhìn thấy loại vấn đề này trước và những gì chúng tôi dự định cho một công cụ như DMS để hỗ trợ. –