Say есть два метода в моей библиотеке:Какой инструмент статического анализа используется для сканирования потока данных от одного метода к другому?
void com.somepackage.SomeClass.someSink(String s)
и
int com.someotherpackage.SomeOtherClass.someSource(int i)
Первый метод используется в качестве приемника данных, в то время как второй в качестве источника данных в моем коде , Параметры типа int, String
приведены в качестве примера и могут измениться в реальной ситуации.
Я хочу, чтобы обнаружить использование этих методов в некотором коде, которые удовлетворяют определенному образцу приведенной ниже:
- некоторых данных (например
x
) генерируется источником - некоторые данные (например
y
) генерируется с использованием серии преобразованийf1(f2(... fn(x))
y
предоставляется раковине.
Преобразования могут быть любыми произвольными функциями, если существует последовательность вызовов от функции, которая генерирует данные для приемника для функции, которая принимает данные из источника. Эти функции могут принимать любые другие параметры и использоваться как черный ящик.
Сканирование может быть на уровне источника или байт-кода. Какие инструменты доступны для такого анализа?
Предпочитайте инструменты, не основанные на IDE, с API Java.
[EDIT:] для уточнения более, someSink
и someSource
произвольные методы имена в классах SomeSome
и SomeOtherClass
соответственно. Они могут быть или не быть static
и могут принимать произвольное количество параметров (которые я должен определить). Тип параметров также не является произвольным. Единственным требованием является то, что инструмент должен сканировать номера кода и номера выводимой строки, где происходит шаблон. Таким образом, инструмент может работать таким образом:
- Получить имя приемника и источника (полное имя имени и имени метода) от пользователя.
- Статически сканировать код и находить все места, где используется данный приемник и источник.
- Проверьте, существует ли путь, когда некоторые данные, выводимые источником, передаются прямо или косвенно с помощью ряда операций (операторов, методов).
- Игнорируйте эти источники/приемники, где такой путь не существует, и выведите оставшиеся (если есть).
Пример вывода:
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, ...)
Примечание: Если функция не принимает параметров, но имеет некоторые побочные влияет на данные также необходимо учитывать. (Пример a = source(); void foo(){ c = a+b }; foo(); sink(c)
- это шаблон, который нужно поймать.)
Вы описываете, что такое диаграмма последовательности UML? Если да, то для этого есть много инструментов (в основном коммерческих). – mazaneicha
Это подмножество диаграммы последовательности, которая удовлетворяет критериям 'data-dependency'. – Jus12
Итак, вы действительно хотите, чтобы у 2-го класса была некоторая косвенная зависимость от первого? –