Какой инструмент командной строки лучше всего подходит для очистки кода?

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

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

Если вам нужна оптимизация, вы можете использовать переключатель gcc -O.

hyperboreean 26.12.2008 01:22

Голосование за закрытие как инструмент рек.

Ciro Santilli新疆棉花TRUMP BAN BAD 02.07.2015 15:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
32
2
11 551
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

В дополнение к -Wall также следует использовать -Wextra.

splicer 06.07.2012 11:39

Линт - классический инструмент для проверки стиля в программах C. Есть более современное его воплощение под названием Шина.Эта запись в Википедии имеет список инструментов статического анализа кода, некоторые бесплатные, некоторые коммерческие.

Ответ принят как подходящий

Как указал Дэн Фего, 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 $*

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

(Обновлено: каждый хочет быть арт-директором.)

Было бы неплохо дать URL-адрес для шины. Предложение с точкой с запятой требует пояснения. Мне неясно, является ли «itm one megaline codes» другим продуктом или опечаткой для «itm one megaline codes», что означает большие базы кодов.

Jonathan Leffler 04.01.2009 20:28

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

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

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

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

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

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

Комментарии PC-Lint для меня странны - это одна из лучших документов, которые я когда-либо видел. Это является громоздко из-за большого количества опций и ошибок - но IMO это природа зверя. Если вы не хотите чьего-то определения того, что проверять / игнорировать.

Steve Fallows 05.01.2009 15:20

@ Стив: Должно быть, я пропустил документацию. Я поправил пост, чтобы никого не вводить в заблуждение. Спасибо.

anon 05.01.2009 22:12

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

Может, gprof выручит?

/ Йохан

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

Другие вопросы по теме