我有一个讨厌的错字,浪费了我和我同事的时间,它是这样的:
for (i = 0; i < blah; i++); // <- I had a semi-colon here, that's the bug!
{
// Some awesome logic here
}
首先,这很尴尬,第二件事,我不应该重复这件事。我对 C 比较陌生。在 Java 中,我想我可以使用FindBugs来捕获此类错误,我应该使用什么工具来处理 C 代码?皮棉?
是的,PC-Lint可能是最好的工具。
除了Lykathea 的 PC-Lint 建议之外,如果您提高编译器的警告级别,您还可以获得更好(或至少更多)的诊断。像/W4
或-Wall
虽然我不确定您的特定问题是否会被此捕获(即使启用了所有警告,MS VC 似乎也没有标记它)。我认为这是因为for
当工作作为循环控制表达式的副作用完成时,循环为空并不是一个不常见的习惯用法。
在我的脑海中,过去拯救了我的几件事:
使用 if (3 == bla) 而不是 (bla == 3),因为如果您拼写错误并键入 (3 = bla) 编译器会抱怨。
使用所有警告开关。你的编译器应该警告你这样的空语句。
尽可能使用断言并进行防御性编程。努力让你的程序尽早失败,你会看到这样的弱点。
不要试图规避编译器或操作系统设置的任何保护措施。它们也可以让您轻松编程。
GCC 具有 Lint 通过警告标志内置的大部分功能。
像 Eclipse 这样的任何良好的 GUI 编程环境(“IDE” - 集成开发环境)都会在这种情况下生成警告。
一个好的语法高亮器会让一些这样的情况更加明显。
我建议看看您是否有能力执行 MISRA 标准。它们是经过深思熟虑编写的,许多规则对于编译器来说很容易检查。例如,我使用的规则要求所有 NOP 命令都有自己的行。这意味着当你放一个 ; 在循环语句的末尾,它将通过一个错误说它不在它自己的行上。
Programming Research的QA·C是另一个很好的C静态分析工具。
在这个(旧)版本的《如何在脚上射击自己》以及网络上的许多其他版本中,C始终是允许最简单程序的语言。在C中编程时,您必须记住这一点并小心。如果您想要保护,请选择另一种语言。
这句话归功于Bjarne Stroustrup (C++) 本人。(错误)引用:
“C 让你很容易射中自己的脚”