查找给定c代码中的错误

c9qzyr3d  于 2023-10-16  发布在  其他
关注(0)|答案(3)|浏览(127)

我很想知道在没有调试器的情况下调试c代码时需要集中精力做什么。有什么值得寻找的?
一般来说,我会寻找以下内容:
1.检查是否将正确的值和类型传递给函数。
1.查找未分配和未初始化的变量
1.检查函数语法和函数是否以正确的方式使用。
1.检查返回值
1.检查锁是否以正确的方式使用。
1.检查字符串终止
1.从函数返回堆栈内存中的变量
1.差一个错误
1.正常语法错误
1.函数声明错误
任何结构化的方法都非常受欢迎。

fcwjkofz

fcwjkofz1#

大多数这些错误将通过向编译器传递适当的warning flags来拾取。
然而,从原始列表中,点1,5,6,7,8非常值得人类检查,然而,一些编译器/标志组合会拾取未处理的值,指向自动内存的指针,以及数组索引中的off-by-one错误等。
您可能希望查看诸如mudflapvalgrindefence等内容,以捕获您不知道的运行时情况。您还可以尝试splint,以增强静态分析。
对于非自动化的方面,尝试静态地遵循程序的流程来处理特定的情况,尤其是极端情况,并验证它似乎在做正确的事情。尝试编写unit tests/测试脚本。一定要使用上面讨论的自动检查。
如果您的重点是在不执行任何测试的情况下进行测试,那么splint可能是最好的起点。您要研究的技术称为static code analysis

xzabzqsa

xzabzqsa2#

我建议尝试使用静态代码分析器。我个人使用过的,可以推荐的:

  • cppcheck-免费和开源,具有嵌入式程序和windows gui
  • Clang Static Analyzer-苹果的免费和开源,最好在mac上支持,也内置在最新的XCode版本中
  • Visual Studio的静态检查器,仅在Premium和Ultimate中可用(即昂贵)版本
  • Coverity-昂贵

如果你想了解更多的细节,你可以阅读an article I wrote

jvidinwx

jvidinwx3#

你漏掉的一个大问题是整数溢出。这包括来自有符号表达式溢出的未定义行为,以及定义良好但可能危险的无符号溢出行为,该行为被减少mod TYPE_MAX+1。特别是,如果count来自一个潜在的不受信任的源(如数据文件),特别是如果sizeof *foo很大,那么像foo=malloc(count*sizeof *foo);这样的东西可能非常危险。
其他一些人:

  • 在比较中混合有符号和无符号值。
  • 使用具有区域特定行为的函数(例如,基数字符、大小写Map等)。
  • 在执行除复制值或相等比较以外的任何操作时使用char(否则您可能需要unsigned char,或者在极少数情况下,signed char)。
  • 使用带符号的表达式与/POWER_OF_2%POWER_OF_2(提示:(-3)%8==-3(-3)&7==5)。
  • 使用符号除法/模一般与负数,因为它的C的版本不同意通常的代数定义时,负数除以一个积极的,很少给出所需的结果。

相关问题