我很想知道在没有调试器的情况下我需要集中精力调试c代码。有什么需要寻找的东西?
一般来说,我会寻找以下内容:
非常感谢任何结构化方法。
答案 0 :(得分:3)
通过将适当的warning flags传递给编译器,可以获取大多数这些错误。
然而,从原始列表中,第1,5,6,7,8点非常值得作为人来检查,但是一些编译器/标志组合会接受未处理的值,指向自动存储器的指针,以及off-by - 数组索引中的一个错误等。
您可能需要查看mudflap,valgrind,efence等内容,以捕获您不知道的运行时案例。您也可以尝试splint,以增强静态分析。
对于未自动化的一面,请尝试静态地关注特定情况下的程序流程,特别是极端情况,并验证自己是否做了正确的事情。尝试编写unit tests /测试脚本。请务必使用上面讨论的一些自动检查。
如果您的重点是在没有任何测试执行的情况下进行测试,那么splint可能是最好的开始。您想要研究的技术称为static code analysis。
答案 1 :(得分:1)
我建议尝试使用众多静态代码分析器之一。那些我个人使用并且可以推荐的:
如果您想了解更多详情,可以阅读有关该主题的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
)。