Инструменты анализа кода и межтиповые объявления

У меня есть проект maven, созданный Spring Roo, и я использую несколько инструментов (checkstyle, pmd и т. д.) для сбора информации о моем проекте. (а именно для этого я использую сонар codehaus)

Roo широко использует декларации межтиповых обозначений AspectJ (ITD) для разделения проблем, таких как постоянство, javabeans-getter/setters и т. д.

Эти ITD встраиваются во время компиляции, поэтому такие инструменты, как checkstyle и pmd (которые работают на уровне исходного кода), имеют много ложных срабатываний.

Единственное решение, которое я сейчас вижу, это деактивировать проверки для классов, использующих ITD.

Есть идеи получше?


person er4z0r    schedule 09.02.2010    source источник
comment
Я некоторое время гуглил об этом, а также говорил с поставщиком инструментов для инструментов SCA. Похоже, это все еще нишевая проблема :-(   -  person er4z0r    schedule 10.02.2010
comment
Мы также используем Roo и Sonar, поэтому мне интересно увидеть ответы на этот вопрос...   -  person Andrew Swan    schedule 18.02.2010
comment
Ах, приятно быть не единственным. Итак, вы знаете, о каких проблемах я говорю?   -  person er4z0r    schedule 18.02.2010
comment
Похоже, ваша проблема заключается в том, что вы просите инструменты SCA обработать исходный код для языка, который они не понимают, а именно для вашего целевого языка + аспекты. Почему бы вам не запустить инструменты анализа над кодом постаспектной обработки, а не над исходным кодом? Тогда информация о типе будет правильной, а язык, который обрабатывают инструменты, будет тем, который они ожидают.   -  person Ira Baxter    schedule 20.02.2010
comment
Это именно тот обходной путь, о котором я говорю. Для меня вопрос не в том, если, а в том, как это должно быть сделано. Для моего особого случая команда roo уже рассматривает проблему, так что у меня есть надежда :-)   -  person er4z0r    schedule 20.02.2010
comment
Так что сложного в обходном пути? Может я не понимаю ход процесса. Я думал, что AspectJ взял исходный код S, применил аспекты и выдал исходный код S с вплетенными аспектами. Почему вы не можете тривиально запускать инструменты SCA поверх S'? Фраза, вплетенная во время компиляции, намекает, что я ошибся, и что AspectJ напрямую создает двоичный файл (.class)?   -  person Ira Baxter    schedule 20.02.2010
comment
Я не могу себе представить, что деактивация проверок будет очень эффективной. Если вы говорите своему инструменту SCA, что он должен игнорировать или не обрабатывать определенные классы, он, несомненно, будет иметь менее точную информацию о том, что делает этот класс, и это повлияет на его рассуждения о других классах, которые взаимодействуют с тем, который вы объявили игнорируемым. Таким образом, вы, вероятно, получите цепочку рассуждений домино, и менее точные результаты не только для игнорируемых классов, но и везде.   -  person Ira Baxter    schedule 20.02.2010
comment
Хорошая мысль Ира. Вот почему я не отметил ответ Андрея как правильный. В лучшем случае это обходной путь. Я не уверен, насколько AspectJ подтвержден, но я думаю, что это разные вещи: объявления Inter Type и PointCuts, но у меня недостаточно опыта работы с AspectJ, чтобы рассказывать подробности.   -  person er4z0r    schedule 20.02.2010
comment
У нас также есть комментарий сообщества AspectJ: old.nabble.com/   -  person er4z0r    schedule 20.02.2010


Ответы (5)


Этот ответ не поможет вам прямо сейчас, но, надеюсь, он может вас заинтересовать, так как обещает решение вашей проблемы в ближайшем будущем. Я не знаю, знаете ли вы IntelliJ IDEA — Java IDE от JetBrains, но работа в этом направлении уже ведется, и вот ссылка на специальный выпуск, за которым вы, возможно, захотите следить: http://youtrack.jetbrains.net/issue/IDEA-26959. Просто установите на нем часы — и получите уведомление, когда функция будет реализована. IntelliJ IDEA предоставляет действительно мощную SCA. Так что поддержка ИТД тоже должна быть качественной.

person Pti.    schedule 25.02.2010
comment
Спасибо за подсказку. Несмотря на то, что мне нравится видеть растущую осведомленность со стороны поставщика инструментов, я бы предпочел решение, которое можно использовать из maven2. Я хочу иметь возможность запускать свой SCA в безголовой среде, такой как сервер CI. Поэтому я не могу позволить себе зависимость от конкретной IDE. - person er4z0r; 26.02.2010
comment
Можно будет запускать проверки кода из maven и на CI-сервере, таком как TeamCity, как это уже делается для других функций анализа IntelliJ IDEA. Их можно использовать независимо от IDE и запускать удаленно на стороне сервера. - person Pti.; 27.02.2010

Сомневаюсь, что это еще долго будет "проблемой ниши" :-) Будем надеяться, что поставщики инструментов рассмотрят необходимые усовершенствования.

person Rod Johnnson    schedule 18.02.2010
comment
Вот это да. Ответ Рода Джонсона. Для меня это большая честь :-) Я спросил некоторых поставщиков коммерческих инструментов, но ответ все еще не получен. Но если я правильно помню, двое из основных разработчиков Aspect-J также работают в springsource, может быть, у них есть идея для умного обходного пути? - person er4z0r; 18.02.2010

И FindBugs, и Cobertura работают НЕ на уровне исходного кода, а на уровне байт-кода. Таким образом, вы должны статически махать своими аспектами (что также улучшит время запуска приложения) во время компиляции (например, с помощью плагина Maven AspectJ), а не во время загрузки, а затем запускать инструменты статического анализа для байт-кода результата.

person Eugene Kuleshov    schedule 26.02.2010
comment
Привет, я проверил это. И вы правы. Большинство ложных срабатываний, которые я получал, исходили от pmd и checkstyle, которые оба работают на уровне исходного кода. Тем не менее проблема остается: вы не можете анализировать код, который не видите. - person er4z0r; 05.03.2010

Если вы хотите рассуждать об исходном коде после того, как аспекты были вплетены в код, вам следует вплетать аспекты в исходный код, а не в двоичный код.

Многие разработчики аспектов выполняют вплетение двоичного кода, потому что у них нет доступа к информации (таблице символов, именам, типам, типам выражений и т. д.), создаваемой внешним интерфейсом компилятора. Итак, хак заключается в том, чтобы использовать код виртуальной машины, созданный компилятором (этот трюк в основном работает только для наборов инструкций VM, таких как коды классов .net IL и java), который часто легко декодировать (хороший, обычный набор инструкций), украшенный информация таблицы символов.

Но если вы не можете рассуждать о двоичных результатах такого процесса плетения, то вы не можете быть уверены, что тканая программа не содержит ошибок, в чем заключается смысл исходного вопроса ОП: «Как мне запустить инструменты SCA? на (эффективном) тканом источнике?».

Вы можете исправить это двумя способами:

  • Попросите сообщество написать инструменты SCA, которые обрабатывают байт-коды, а не исходный код. Это может быть сложно, поскольку исходный код может содержать информацию, потерянную в процессе компиляции.
  • Идея получше: попросите сообщество аспектов написать программы для создания аспектов, которые работают с исходным кодом и создают исходный код. Это может быть сложно, потому что сложно получить полноценный языковой интерфейс.

Я не могу помочь вам заставить сообщество сделать выбор.

Я могу настоятельно рекомендовать помочь сообществу выбрать второй путь: наш DMS Software Reengineering Toolkit< /а>. Это система преобразования программ, которая выполняет директивы в форме «если вы видите это, замените это на это», но с соблюдением синтаксиса и семантики языка. фактически применяя такие изменения к структурам данных компилятора, созданным полным интерфейсом языка. (Это версия эквациональной замены в математике для инженеров-программистов). Измененные структуры данных могут быть повторно экспортированы в виде компилируемого исходного текста с комментариями.

Если вы понимаете, что вообще могут делать преобразования, вы можете увидеть, что аспектные ткачи — это особый случай. систем преобразования программ. Таким образом, с помощью DMS легко реализовать ткачи аспектов, а результаты представляют собой исходный код, что означает, что вы можете применять инструменты анализа исходного кода.

Я сомневаюсь, что это на самом деле решает проблему ОП анализа сгенерированного Roo кода в краткосрочной перспективе :-{

person Ira Baxter    schedule 23.02.2010

Не могли бы вы добавить аннотации/комментарии для конкретного инструмента в код Java, чтобы подавить ложные срабатывания? Например, FindBugs имеет собственную аннотацию @SuppressWarnings.

person Andrew Swan    schedule 17.02.2010
comment
Хм интересно. Я не знал этого. Несмотря на то, что это будет работать только для каждого инструмента, это может быть отправной точкой. - person er4z0r; 18.02.2010
comment
Согласно документации, вы не должны касаться файлов AspectJ. Эти файлы предназначены для управления самой оболочкой и могут быть обновлены при установке новых версий Roo. - person tsunade21; 11.10.2011
comment
Я имел в виду изменение кода Java, а не ITD; Я обновил свой ответ, чтобы быть более ясным. Но мне, как члену команды Roo, приятно видеть, что пользователи знают, что редактировать ITD нельзя! :-) - person Andrew Swan; 12.10.2011