Статический анализ Java: Начало работы - PullRequest
1 голос
/ 20 февраля 2012

Привет, я хотел начать играть со статическим анализом исходного кода Java. Для начала кажется, что проще всего разобрать мое исходное дерево, однако предположим, что для этого есть API. В частности, было бы неплохо иметь API, который разрешал бы такой код:

for (MetaClass m : mySourcePackage.getClasses()) 
{
       System.out.println(m.getMethods().size());
       ...
}

Конечно, для любого данного класса вы можете сделать это с помощью рефлексии - но меня больше интересует статический анализ всего пакета исходного кода с нуля - и итерация классов по одному (например, для оценки вещей) как тестовое покрытие, максимальное количество строк и т.д ....).

Существуют ли какие-либо высококачественные платформы с открытым исходным кодом для проведения такого метаанализа (или, возможно, возможно ли запустить JVM с определенным путем к классу и выполнить такой анализ внутри JVM)?

Пожалуйста, имейте в виду, что я НЕ особенно беспокоюсь о таких проблемах, как DI и рефлексия (по крайней мере, не сейчас).

Ответы [ 4 ]

3 голосов
/ 20 февраля 2012

Findbugs можно рассматривать как основу для статического анализа.Вы могли бы реализовать новые детекторы, которые имеют свои конкретные цели. Учебное пособие "Как"

Кроме того, вот несколько библиотек, которые охватывают указанные вами цели:

Дополнительные инструменты / библиотеки

2 голосов
/ 15 января 2015

склонен к ошибкам - еще один хороший инструмент для просмотра, он используется Google и имеет очень низкий коэффициент ложных срабатываний,

https://github.com/google/error-prone

код очень хорошо структурирован,

например. здесь можно увидеть, как реализована проверка на равенство массива

1 голос
/ 08 марта 2012

Javalib / Sawja - это библиотека для написания статических анализаторов для Java в Caml .

Предоставляет множество строительных блоков, необходимых для статического анализа, включая примитивы:

  • разбирать байт-код Java
  • создавать и манипулировать промежуточными представлениями
  • манипулировать отдельными инструкциями, методами, классами и целыми программами
  • обработка иерархий классов и алгоритмов управления потоком

Документация довольно хорошая, и, если я правильно помню, в дистрибутив входят несколько примеров, с которых можно начать.

Учитывая все это, реализация описанных вами метрик исходного кода должна быть быстрой и легкой. Например, ниже приведен короткий, непроверенный фрагмент, который предназначен для подсчета количества методов в данном классе:

open Sawja_pack
open Javalib_pack

let size methodmap =
  JBasics.MethodMap.fold (fun _ _ count -> count+1) methodmap 0

let main classname classpath =
  let interface_or_class  = Javalib.get_class classpath (JBasics.make_cn classname) in
  let all_concrete_methods= Javalib.get_concrete_methods interface_or_class in
  print_int (size all_concrete_methods);
  exit 0
0 голосов
/ 20 февраля 2012

Если вас интересует статический анализ для тестового покрытия вашего кода, вы можете использовать Cobertura - и eCobertura плагин для Eclipse IDE.

...