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