Инструменты для [закрытого] рефакторинга кода C

Для инструментов статического анализа я часто использую CPD, PMD, FindBugs, и Checkstyle.

CPD является инструментом "Copy/Paste Detector" PMD. Я использовал PMD на некоторое время, прежде чем я заметил "Открытие Дублированный Код" ссылка на веб-страница PMD .

я хотел бы указать, что эти инструменты могут иногда расширяться вне их "out-of-the-box" ряда правил. И не только, потому что они - открытый исходный код так, чтобы можно было переписать их. Некоторые из этих инструментов идут с приложениями или "рычагами", которые позволяют им быть расширенными. Например, PMD идет инструмент "разработчика" , который позволяет Вам создавать новые правила. Кроме того, Checkstyle имеет проверка DescendantToken, которая имеет свойства, которые допускают существенную настройку.

я интегрирую эти инструменты с [1 132] Основанная на муравье сборка . Можно перейти по ссылке для наблюдения моей прокомментированной конфигурации.

В дополнение к простой интеграции в сборку, я нахожу полезным настроить инструменты, которые будут несколько "интегрированы" несколькими другими способами. А именно, сообщите о поколении и предупреждении однородности подавления. Я хотел бы добавить эти аспекты к этому обсуждению (который должен, вероятно, иметь тег "статического анализа" также): как люди настраивают эти инструменты для создания "объединенного" решения? (Я задал этот вопрос отдельно здесь )

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

/absolute-path/filename:line-number:column-number: warning(tool-name): message

Это часто называют "форматом Emacs", но даже если Вы не используете Emacs, это - разумный формат для гомогенизации отчетов. Например:

/project/src/com/example/Foo.java:425:9: warning(Checkstyle):Missing a Javadoc comment.

Мое предупреждение преобразований формата сделаны моим скриптом Ant с Муравьем filterchains.

вторая "интеграция", которую я делаю, для предупреждения подавления. По умолчанию каждый инструмент поддерживает комментарии или аннотацию (или оба), что можно поместить в коде для глушения предупреждения, что Вы хотите проигнорировать. Но эти различные запросы подавления предупреждения не имеют последовательного взгляда, который кажется несколько глупым. При подавлении предупреждения Вы подавляете предупреждение, итак, почему не всегда пишут" SuppressWarning?"

, Например, конфигурация PMD по умолчанию подавляет предупреждение поколения на строках кода со строкой" NOPMD" в комментарии. Кроме того, PMD поддерживает Java @SuppressWarnings аннотация. Я настраиваю PMD для использования комментариев, содержащих" SuppressWarning(PMD." вместо [1 110] так, чтобы подавления PMD выглядели подобными. Я заполняю конкретное правило, которое нарушено при использовании подавления стиля комментария:

// SuppressWarnings(PMD.PreserveStackTrace) justification: (false positive) exceptions are chained

Только" SuppressWarnings(PMD." часть является значительной для комментария, но это согласовывается с поддержкой PMD @SuppressWarning аннотация, которая действительно распознает отдельные нарушения правила по имени:

@SuppressWarnings("PMD.CompareObjectsWithEquals") // justification: identity comparision intended

Точно так же Checkstyle подавляет предупреждение поколения между парами комментариев (никакая поддержка аннотации не оказывается). По умолчанию комментарии для выключения и включения Checkstyle содержат строки CHECKSTYLE:OFF и CHECKSTYLE:ON, соответственно. Изменение этой конфигурации (с "SuppressionCommentFilter" Checkstyle) для использования строк" BEGIN SuppressWarnings(CheckStyle." и" END SuppressWarnings(CheckStyle." заставляет средства управления посмотреть больше как PMD:

// BEGIN SuppressWarnings(Checkstyle.HiddenField) justification: "Effective Java," 2nd ed., Bloch, Item 2
// END SuppressWarnings(Checkstyle.HiddenField)

С комментариями Checkstyle, конкретное нарушение проверки (HiddenField) значительно, потому что каждая проверка имеет свое собственное" BEGIN/END" пара комментария.

FindBugs также поддерживает предупреждение подавления поколения с @SuppressWarnings аннотация, таким образом, никакая дальнейшая конфигурация не требуется, чтобы достигать некоторого уровня однородности с другими инструментами. К сожалению, Findbugs должен поддерживать пользовательское @SuppressWarnings аннотация, потому что встроенная аннотация Java @SuppressWarnings имеет SOURCE политика хранения, которая не достаточно сильна для сохранения аннотации в файле класса, где FindBugs нужен он. Я полностью определяю подавления предупреждений FindBugs, чтобы не сталкиваться с Java @SuppressWarnings аннотация:

@edu.umd.cs.findbugs.annotations.SuppressWarnings("UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR")

Эти методы заставляет вещи выглядеть довольно последовательными через инструменты. Обратите внимание, что наличие каждого подавления предупреждения содержит строку" SuppressWarnings", облегчает запускать простой поиск для нахождения всех экземпляров для всех инструментов по всей кодовой базе.

7
задан Puppe 11 November 2009 в 07:17
поделиться

4 ответа

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

Для emacs есть xrefactory , но я сам не пробовал .

6
ответ дан 7 December 2019 в 01:22
поделиться

Slickedit хорошо справляется с рефакторингом.

0
ответ дан 7 December 2019 в 01:22
поделиться

Может быть, этот предыдущий вопрос может помочь , по крайней мере, в ускорении цикла компиляции-выполнения.

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

0
ответ дан 7 December 2019 в 01:22
поделиться

Я использую Eclipse с CDT в качестве IDE и считаю, что он хорошо работает для рефакторинга и поиска кода.

2
ответ дан 7 December 2019 в 01:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: