【问题标题】:What is the best command-line tool to clean up code?清理代码的最佳命令行工具是什么?
【发布时间】:2010-09-28 10:29:29
【问题描述】:

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

有人知道什么好工具吗?

【问题讨论】:

  • 如果需要优化,可以使用 gcc 的 -O 开关。
  • 投票结束作为工具记录

标签: c


【解决方案1】:

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

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

【讨论】:

  • 为夹板提供一个 URL 会很好。 “后分号”句子需要澄清。我不清楚“itm one megaline codes”是另一种产品,还是“it on megaline codes”的错字,意思是大型代码库。
【解决方案2】:

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

也许 gprof 可以帮忙?

/约翰

编辑:或者既然您谈到了清理,请颠倒我上面的答案并删除永远不会执行的代码。

【讨论】:

    【解决方案3】:

    虽然我确信这不是静态代码分析工具的完整列表,但以下是我对过去使用过的一些不同工具的印象。 (我主要与 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 - List of tools for static code analysisInspection/Review Tools, Source/Binary Code Static AnalyzersSource Code Security Analyzers

    【讨论】:

    • PC-Lint cmets 对我来说很奇怪——一些我见过的最好的文档。由于大量的选项和错误,它笨重的 - 但 IMO 这就是野兽的本性。除非您想要其他人对要检查/忽略的内容的定义。
    • @Steve:我一定是错过了文档。我已经更正了帖子,以免误导任何人。谢谢。
    【解决方案4】:

    正如 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 $*
    

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        如果您使用 -Wall 运行 gcc,它会捕获您提到的一些内容,例如未使用的变量(可能还有未使用的函数)。在优化方面,我不知道,尽管总的来说编译器足够聪明,可以进行重要的优化,所以我不会太担心。只是不要使用可怕的算法。 ;-)

        【讨论】:

        • 除了-Wall,还应该使用-Wextra。
        猜你喜欢
        • 1970-01-01
        • 2010-09-06
        • 1970-01-01
        • 1970-01-01
        • 2012-11-21
        • 2011-04-04
        • 2021-02-04
        • 1970-01-01
        相关资源
        最近更新 更多