清理代码的最佳命令行工具是什么?

时间:2008-12-25 21:48:24

标签: c

当我编写C代码时,我只使用编辑器和gcc。我想知道是否有人可以建议一个好的和简单的工具,它将找到未使用的变量,函数声明并可能进行一些优化。

有人知道一个好工具吗?

6 个答案:

答案 0 :(得分:28)

正如Dan Fego指出的那样,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 $*

答案 1 :(得分:14)

Lint是检查C程序样式的经典工具。它有更现代化的版本Splint. This Wikipedia entry有一个静态代码分析工具列表,一些是免费的,一些是商业的。

答案 2 :(得分:10)

虽然我确信这不是一个全面的静态代码分析工具列表,但这里是我对过去曾经使用过的一些不同内容的印象。 (我主要与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的补充。

  5. 如果您不使用C,则可能还需要查看:Wikipedia - List of tools for static code analysisInspection/Review Tools, Source/Binary Code Static AnalyzersSource Code Security Analyzers

答案 3 :(得分:6)

如果你用-Wall运行gcc,它会抓住你提到的一些东西,比如未使用的变量(也许是未使用的函数)。在优化方面,我没有,尽管一般来说编译器足够聪明,可以进行重要的优化,所以我不会太担心。只是不要使用可怕的算法。 ; - )

答案 4 :(得分:3)

夹板(http://www.splint.org/)非常出色;我在megaline代码上使用它来寻找这种东西,

(更新:每个人都希望成为艺术总监。)

答案 5 :(得分:0)

如何使用分析器并查找运行最多的代码,并专注于这些部分。

也许gprof可以提供帮助吗?

/约翰

编辑:或者既然你谈到了清理工作,请将上面的答案反转并删除从不执行的代码。