【问题标题】:Any Tools to Catch Silly Mistakes in C Code?有什么工具可以捕捉 C 代码中的愚蠢错误?
【发布时间】:2008-10-15 18:43:56
【问题描述】:

我有一个讨厌的错字,浪费了我和我同事的时间,是这样的:

for (i = 0; i < blah; i++); // <- I had a semi-colon here, that's the bug!
{
  // Some awesome logic here
}

首先,这很尴尬,其次,我不应该再重复这件事。我对 C 语言比较陌生。在 Java 中,我想我可以使用 FindBugs 来捕获此类错误,我应该为 C 代码使用什么工具?棉绒?

【问题讨论】:

  • 我们在这里使用棒球棒取得了巨大的成功。在我们发现第一个愚蠢的错误之后,他们往往不会再犯!
  • 啊,分号问题是一个反复出现的问题。一个多出来的,一个缺失的;没有什么不同的。它们都导致相同的痛苦搜索,该搜索需要永远并导致“Doh!”和一记耳光。我仍然时不时地拥有它。
  • 您可能想要指定平台。并非所有工具都能在所有平台上保持不变。

标签: c findbugs lint


【解决方案1】:

是的,PC-Lint 可能是最好的工具。

【讨论】:

  • 但是,如果代码库是任意大小且尚未被 linted,请准备好迎接 大量 警告。
  • 确实有很多警告 - 但它们都可以单独配置。所以你可以关闭任何你需要的东西。
【解决方案2】:

除了Lykathea's PC-Lint suggestion,如果您提高编译器的警告级别,您还可以获得更好(或至少更多)的诊断。 /W4-Wall 之类的东西

虽然我不确定您的特定问题是否会被此捕获(即使启用了所有警告,MS VC 似乎也不会标记它)。我认为这是因为当作为循环控制表达式的副作用完成工作时,for 循环为空的习惯用法并不少见。

【讨论】:

    【解决方案3】:

    过去曾拯救过我的几件事,从我的脑海中浮现出来:

    • 使用 if (3 == bla) 而不是 (bla == 3),因为如果拼写错误并输入 (3 = bla),编译器会报错。

    • 使用 all-warnings 开关。你的编译器应该警告你这样的空语句。

    • 尽可能使用断言并进行防御性编程。努力让你的程序尽早失败,你会看到这样的弱点。

    • 不要试图规避编译器或操作系统设置的任何保护措施。它们也可以让您轻松编程。

    【讨论】:

    • 我不喜欢 (CONST == var) 约定。它使代码的可读性大大降低。静态分析工具将确保您从不输入(var = CONST)
    【解决方案4】:

    【讨论】:

      【解决方案5】:

      我将从了解splintgdb 开始。如果您需要更高级的,请在这两个工具的基础上进行构建。但它们是一个好的开始。

      【讨论】:

        【解决方案6】:

        GCC 具有 Lint 通过 warning flags 内置的大部分功能。

        【讨论】:

          【解决方案7】:

          任何良好的 GUI 编程环境(“IDE”- 集成开发环境)如 Eclipse 都会在这种情况下生成警告。

          【讨论】:

            【解决方案8】:

            一个好的语法高亮器会让一些这样的情况更加明显。

            【讨论】:

              【解决方案9】:

              我建议你看看你是否有能力enforce MISRA standards。它们是经过深思熟虑编写的,许多规则对于编译器来说很容易检查。例如,我使用的规则要求所有 NOP 命令都有自己的行。这意味着当你放一个 ;在循环语句结束时,它会通过一个错误提示它不在它自己的行上。

              【讨论】:

                【解决方案10】:

                Programming Research 的QA·C 是另一个很好的 C 静态分析工具。

                【讨论】:

                  【解决方案11】:

                  在这个(旧)版本的How to Shoot Yourself In the Foot 以及网络上的许多其他版本中,C 始终是允许最简单过程的语言。在 C 中编程时,您必须记住这一点并小心。如果您想要保护,请选择另一种语言。

                  这句话是attributed 对 Bjarne Stroustrup (C++) 本人说的。 (错误)引用:

                  “C 让你很容易射中自己的脚”

                  【讨论】:

                  • 我听到的那句话是“C 让你很容易射中自己的脚,但使用 C++ 会炸掉你的整条腿”
                  • Steven A. Lowe,您是对的 - 请参阅 Stroustrup 链接。这就是我写“(mis)quote”的原因。
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-12-06
                  • 2021-06-27
                  • 2011-06-12
                  • 2018-03-25
                  • 2015-01-01
                  相关资源
                  最近更新 更多