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)
và
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:
- một số dữ liệu (chẳng hạn
x
) được tạo ra bởi các nguồn - 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 đổif1(f2(... fn(x))
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, someSink
và someSource
là các tên phương thức tùy ý trong các lớp SomeSome
và SomeOtherClass
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.)
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
Đâ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
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? –