在给定的c代码中查找错误

时间:2010-08-12 04:52:56

标签: c code-analysis

我很想知道在没有调试器的情况下我需要集中精力调试c代码。有什么需要寻找的东西?

一般来说,我会寻找以下内容:

  1. 检查是否将正确的值和类型传递给函数。
  2. 查找未分配和未初始化的变量
  3. 检查功能语法和功能是否正确使用。
  4. 检查返回值
  5. 检查锁是否正确使用。
  6. 检查字符串终止
  7. 从函数
  8. 返回堆栈内存中的变量
  9. 关闭一个错误
  10. 正常语法错误
  11. 功能声明错误
  12. 非常感谢任何结构化方法。

3 个答案:

答案 0 :(得分:3)

通过将适当的warning flags传递给编译器,可以获取大多数这些错误。

然而,从原始列表中,第1,5,6,7,8点非常值得作为人来检查,但是一些编译器/标志组合会接受未处理的值,指向自动存储器的指针,以及off-by - 数组索引中的一个错误等。

您可能需要查看mudflapvalgrindefence等内容,以捕获您不知道的运行时案例。您也可以尝试splint,以增强静态分析。

对于未自动化的一面,请尝试静态地关注特定情况下的程序流程,特别是极端情况,并验证自己是否做了正确的事情。尝试编写unit tests /测试脚本。请务必使用上面讨论的一些自动检查。

如果您的重点是在没有任何测试执行的情况下进行测试,那么splint可能是最好的开始。您想要研究的技术称为static code analysis

答案 1 :(得分:1)

我建议尝试使用众多静态代码分析器之一。那些我个人使用并且可以推荐的:

  • cppcheck - 免费开源,有cmd-line程序和windows gui
  • Clang Static Analyzer - Apple的免费开源,最好的Mac支持,也是最新的XCode版本构建
  • Visual Studio的静态检查程序,仅适用于Premium和Ultimate(即昂贵)版本
  • Coverity - 昂贵的

如果您想了解更多详情,可以阅读有关该主题的an article I wrote

答案 2 :(得分:1)

你遗漏的一个大问题是整数溢出。这包括来自有符号表达式溢出的未定义行为,以及明确定义但可能危险的无符号溢出行为被减少mod TYPE_MAX+1。特别是,如果foo=malloc(count*sizeof *foo);来自可能不受信任的来源(如数据文件),count之类的内容可能会非常危险,尤其是sizeof *foo很大时。

其他一些人:

  • 在比较中混合有符号和无符号值。
  • 当需要明确定义的统一行为时,使用具有特定于语言环境的行为的函数(例如基数字符,大小写映射等)。
  • 在执行任何操作而不是复制值或比较相等时使用char(否则您可能需要unsigned char或者在极少数情况下signed char)。
  • 使用带有/POWER_OF_2%POWER_OF_2的签名表达式(提示:(-3)%8==-3(-3)&7==5)。
  • 一般使用带符号的除法/模数与负数,因为C的版本不符合通常的代数定义,当负数除以正数时,很少给出所需的结果。