Каков лучший инструмент командной строки для очистки кода? - PullRequest
31 голосов
/ 26 декабря 2008

Когда я пишу C-код, я использую только редактор и gcc. Мне было интересно, кто-нибудь может предложить хороший и простой инструмент, который найдет неиспользуемые переменные, объявления функций и, возможно, сделает некоторые оптимизации.

Кто-нибудь знает хороший инструмент?

Ответы [ 6 ]

28 голосов
/ 26 декабря 2008

Как отметил Дэн Фего, GCC может перехватывать неиспользуемые переменные и неиспользуемые статические функции. Обычно он не находит неиспользуемые внешние функции, так как он обычно работает по одному исходному файлу за раз.

GCC (v4.3.2) имеет сотни, если не тысячи вариантов. Может помочь '--combine' для объединения исходных файлов (если вы не привыкли помещать одинаковые имена функций или переменных в разные исходные файлы).

Опция '--help' говорит вам больше; опции '--help=optimizers' и '--help=warnings' каждая дают вам пару сотен строк вывода. Предупреждения включают в себя:

-Wunused                    This switch lacks documentation
-Wunused-function           Warn when a function is unused
-Wunused-label              This switch lacks documentation
-Wunused-macros             Warn about macros defined in the main file that
                            are not used
-Wunused-parameter          Warn when a function parameter is unused
-Wunused-value              Warn when an expression value is unused
-Wunused-variable           Warn when a variable is unused

Добавлено : это скрипт с именем glint, который я использую для очистки своего кода. Он довольно старый, поэтому он не использует нотацию «#!/bin/sh» для первой строки и говорит «$*» вместо «"$@"», оба из которых должны быть исправлены, но ни одна не должна быть исправлена срочно. Обратите внимание, что, хотя GCC 4.x больше не поддерживает опцию '-fwriteable-strings', он все еще поддерживает опцию '-Wwrite-strings' и имеет значение.

Этот сценарий демонстрирует, что вы можете извлечь много пользы из существующих инструментов, выполнив лишь небольшое количество работы. Вы можете настроить практически все параметры, которые он использует, хотя в основном через среду, а не из командной строки. Конечно, вы можете добавить дополнительные параметры предупреждения в командную строку; то, что вы не можете сделать, это удалить предопределенные параметры, кроме как через среду. Но это нормально; они выбраны по умолчанию по уважительным причинам. В эти дни я, вероятно, установил бы 'GLINT_ANSI=-std=c99' или исправил бы скрипт; Я не использовал его в последнее время, так как я достаточно близко кодирую стандарт, который glint применяет. (Обратите внимание, что «-o /dev/null» означает, что вы можете сделать только один файл за раз; взломать, чтобы исправить!)

:   "@(#)$Id: glint.sh,v 1.5 2002/08/09 21:40:52 jleffler Exp jleffler $"
#
#   Use GCC as excruciatingly pedantic lint
#   Not a complete replacement for lint -- it doesn't do inter-file checking.
#   Now configurable via the environment.
#   Use GLINT_EXTRA_FLAGS to set extra flags via the environment.
#   NB: much Solaris code won't work with -undef enabled.

: ${GLINT_GCC:='gcc'}

: ${GLINT_ANSI='-ansi'}
: ${GLINT_FNO_COMMON='-fno-common'}
: ${GLINT_FSHORT_ENUMS='-fshort-enums'}
: ${GLINT_PEDANTIC='-pedantic'}
: ${GLINT_UNDEF='-undef'}
: ${GLINT_W='-W'}
: ${GLINT_WAGGREGATE_RETURN='-Waggregate-return'}
: ${GLINT_WALL='-Wall'}
: ${GLINT_WCAST_ALIGN='-Wcast-align'}
: ${GLINT_WCAST_QUAL='-Wcast-qual'}
: ${GLINT_WCONVERSION='-Wconversion'}
: ${GLINT_WMISSING_DECLARATIONS='-Wmissing-declarations'}
: ${GLINT_WREDUNDANT_DECLS='-Wredundant-decls'}
: ${GLINT_WMISSING_PROTOTYPES='-Wmissing-prototypes'}
: ${GLINT_WNESTED_EXTERNS='-Wnested-externs'}
: ${GLINT_WPOINTER_ARITH='-Wpointer-arith'}
: ${GLINT_WSHADOW='-Wshadow'}
: ${GLINT_WSTRICT_PROTOTYPES='-Wstrict-prototypes'}
: # ${GLINT_WTRADITIONAL='-Wtraditional'}
: ${GLINT_WWRITE_STRINGS='-Wwrite-strings'}

exec ${GLINT_GCC} \
    ${GLINT_ANSI} \
    ${GLINT_FNO_COMMON} \
    ${GLINT_FSHORT_ENUMS} \
    ${GLINT_PEDANTIC} \
    ${GLINT_UNDEF} \
    ${GLINT_WAGGREGATE_RETURN} \
    ${GLINT_WALL} \
    ${GLINT_WCAST_ALIGN} \
    ${GLINT_WCAST_QUAL} \
    ${GLINT_WCONVERSION} \
    ${GLINT_WMISSING_DECLARATIONS} \
    ${GLINT_WREDUNDANT_DECLS} \
    ${GLINT_WMISSING_PROTOTYPES} \
    ${GLINT_WNESTED_EXTERNS} \
    ${GLINT_WPOINTER_ARITH} \
    ${GLINT_WSHADOW} \
    ${GLINT_WSTRICT_PROTOTYPES} \
    ${GLINT_WTRADITIONAL} \
    ${GLINT_WWRITE_STRINGS} \
    ${GLINT_W} \
    ${GLINT_EXTRA_FLAGS} \
    -o /dev/null -O4 -g -c $*
14 голосов
/ 26 декабря 2008

Lint - классический инструмент для проверки стиля в программах на Си. Существует более современное воплощение, которое называется Splint. Эта запись в Википедии содержит список инструментов статического анализа кода, некоторые бесплатные, некоторые коммерческие.

10 голосов
/ 05 января 2009

Хотя я уверен, что это не полный список инструментов статического анализа кода , вот мои впечатления о некоторых из них, с которыми я работал в прошлом. (Я работаю в основном с C.)

  1. Splint : Я часто использую Splint, потому что он доступен для многих дистрибутивов GNU / Linux. С ним относительно легко работать; однако, это имеет тенденцию быть подавляющим при работе в самых строгих условиях. Более того, иногда необходимое использование аннотаций может загромождать и запутывать легко читаемый код. Несмотря на это, я предлагаю использовать его.

  2. Uno : Uno определенно многообещающий, но он не так строг, как Splint (по замыслу). Вместо этого он фокусируется на ясности и полезности своих предупреждений. Для меня Uno полезна только в качестве дополнения к Splint (чтобы четко указать предупреждения, скрытые среди сравнительно многих, которые выдает Splint).

  3. PC-lint : Я считаю, что PC-lint неудобен для проприетарной программы. Однажды я использовал его при разработке для MS-DOS, а загадочные имена, которые он использует из-за ошибок, сделали его очень сложным в использовании. Из того, что я слышал, в MS-DOS есть много лучших продуктов для использования.

  4. Pscan : (Мертвая гиперссылка) Pscan отлично подходит для поиска уязвимостей форматной строки! Как и в случае с Uno, я предлагаю использовать его как дополнение к Splint.

Если вы не работаете с C, вы также можете проверить: Wikipedia - Список инструментов для статического анализа кода , Инструменты для проверки / просмотра, Статические анализаторы исходного / двоичного кода и Анализаторы безопасности исходного кода .

6 голосов
/ 26 декабря 2008

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

3 голосов
/ 26 декабря 2008

шины (http://www.splint.org/) - это отлично; я использовал их на мегалиновых кодах, чтобы искать подобные вещи,

(Обновлено: все хотят быть художественным руководителем.)

0 голосов
/ 07 января 2009

Как насчет использования профилировщика и определения того, какой код выполняется чаще всего, и сосредоточиться на этих частях.

Может быть, gprof может помочь?

/ Johan

Изменить: Или, поскольку вы говорили об очистке, переверните мой ответ выше и удалите код, который никогда не выполняется.

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