2012-05-06 4 views
5

Say есть два метода в моей библиотеке:Какой инструмент статического анализа используется для сканирования потока данных от одного метода к другому?

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

и

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

Первый метод используется в качестве приемника данных, в то время как второй в качестве источника данных в моем коде , Параметры типа int, String приведены в качестве примера и могут измениться в реальной ситуации.

Я хочу, чтобы обнаружить использование этих методов в некотором коде, которые удовлетворяют определенному образцу приведенной ниже:

  1. некоторых данных (например x) генерируется источником
  2. некоторые данные (например y) генерируется с использованием серии преобразований f1(f2(... fn(x))
  3. 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) - это шаблон, который нужно поймать.)

+0

Вы описываете, что такое диаграмма последовательности UML? Если да, то для этого есть много инструментов (в основном коммерческих). – mazaneicha

+0

Это подмножество диаграммы последовательности, которая удовлетворяет критериям 'data-dependency'. – Jus12

+0

Итак, вы действительно хотите, чтобы у 2-го класса была некоторая косвенная зависимость от первого? –

ответ

3

После ряда исследований я обнаружил, что soot является лучшим для такого рода задач. Сажа более зрелая, чем другие альтернативы с открытым исходным кодом, такие как PQL.

2

Таким образом, роль методов источника и приемника заключается в том, что х возникает из исходного метода (где-то) и потребляется (где-то) в целевом методе? Как вы охарактеризовали «x», или просто хотите, чтобы все x имели это свойство?

Предполагая, что вы идентифицировали конкретный x в исходном методе, вы a) настаиваете на том, чтобы x был передан целевому методу только с помощью вызовов методов [что сделало бы целевой метод последним вызовом в вашей цепочке вызовов ], или можно скопировать одно из промежуточных значений? б) настаивать на том, что каждый вызов функции имеет точно один аргумент?

Мы сделали что-то подобное для больших систем С. Проблема заключалась в том, чтобы отследить назначенную переменную в использовании в других функциях, если бы они были, в том числе значения, не идентичные в представлении, но идентичные в намерении («абстрактная копия»; строка «1.0» абстрактно эквивалентна целому числу 1, если я использую строка в конечном итоге как число, «int_to_string» - это функция «абстрактной копии», которая преобразует значение в одно представление в эквивалентное значение в другом.).

Что нам нужно для этого - аналитический анализ определений для каждой функции («где это значение от конкретного назначения?») И «абстрактная копия», которая анализирует, что определяет, где достигнутое значение потребляется специальными функции, помеченные как «абстрактные копии», и результат достижения этой функции копирования абстата. Тогда транзитивное замыкание «x достигает z» и «x достигает f (x) достигает z", вычисленного, где x может идти.

Мы сделали это с помощью нашего DMS Software Reengineering Toolkit, который обеспечивает общий разбор и анализ потока машин, и DMS-х C Front End, который реализует конкретные достижения и абстрактно-копия идущих вычислений для C. DMS имеет Java Front End, вычисляющие достигающие определения; можно было бы добавить логику абстракции для копирования и повторить реализацию транзитивного кода замыкания.

+0

Каждая вызванная функция может иметь любое количество параметров. Тип возврата также может быть любым. Я обновил свой вопрос. Пожалуйста, дайте мне знать, если это прояснит это. – Jus12

+0

Есть ли альтернатива DMS-инструментарию? Предпочтительно что-то открытое. – Jus12

+0

Ну, есть API-интерфейс компилятора Java, и есть Wala. Они могут иметь некоторые возможности анализа потока. Но я думаю, что вы хотите проанализировать поток в методах в классах, и я не уверен, сколько поддержки они предоставляют для этого. Я предлагаю DMS, потому что это то, что я знаю, и потому, что мы видели эту проблему раньше и ее то, что мы намерены поддерживать таким инструментом, как DMS. –