我很想知道在没有调试器的情况下调试c代码时需要集中精力做什么。有什么值得寻找的?一般来说,我会寻找以下内容:1.检查是否将正确的值和类型传递给函数。1.查找未分配和未初始化的变量1.检查函数语法和函数是否以正确的方式使用。1.检查返回值1.检查锁是否以正确的方式使用。1.检查字符串终止1.从函数返回堆栈内存中的变量1.差一个错误1.正常语法错误1.函数声明错误任何结构化的方法都非常受欢迎。
fcwjkofz1#
大多数这些错误将通过向编译器传递适当的warning flags来拾取。然而,从原始列表中,点1,5,6,7,8非常值得人类检查,然而,一些编译器/标志组合会拾取未处理的值,指向自动内存的指针,以及数组索引中的off-by-one错误等。您可能希望查看诸如mudflap、valgrind、efence等内容,以捕获您不知道的运行时情况。您还可以尝试splint,以增强静态分析。对于非自动化的方面,尝试静态地遵循程序的流程来处理特定的情况,尤其是极端情况,并验证它似乎在做正确的事情。尝试编写unit tests/测试脚本。一定要使用上面讨论的自动检查。如果您的重点是在不执行任何测试的情况下进行测试,那么splint可能是最好的起点。您要研究的技术称为static code analysis。
xzabzqsa2#
我建议尝试使用静态代码分析器。我个人使用过的,可以推荐的:
如果你想了解更多的细节,你可以阅读an article I wrote。
jvidinwx3#
你漏掉的一个大问题是整数溢出。这包括来自有符号表达式溢出的未定义行为,以及定义良好但可能危险的无符号溢出行为,该行为被减少mod TYPE_MAX+1。特别是,如果count来自一个潜在的不受信任的源(如数据文件),特别是如果sizeof *foo很大,那么像foo=malloc(count*sizeof *foo);这样的东西可能非常危险。其他一些人:
TYPE_MAX+1
count
sizeof *foo
foo=malloc(count*sizeof *foo);
char
unsigned char
signed char
/POWER_OF_2
%POWER_OF_2
(-3)%8==-3
(-3)&7==5
3条答案
按热度按时间fcwjkofz1#
大多数这些错误将通过向编译器传递适当的warning flags来拾取。
然而,从原始列表中,点1,5,6,7,8非常值得人类检查,然而,一些编译器/标志组合会拾取未处理的值,指向自动内存的指针,以及数组索引中的off-by-one错误等。
您可能希望查看诸如mudflap、valgrind、efence等内容,以捕获您不知道的运行时情况。您还可以尝试splint,以增强静态分析。
对于非自动化的方面,尝试静态地遵循程序的流程来处理特定的情况,尤其是极端情况,并验证它似乎在做正确的事情。尝试编写unit tests/测试脚本。一定要使用上面讨论的自动检查。
如果您的重点是在不执行任何测试的情况下进行测试,那么splint可能是最好的起点。您要研究的技术称为static code analysis。
xzabzqsa2#
我建议尝试使用静态代码分析器。我个人使用过的,可以推荐的:
如果你想了解更多的细节,你可以阅读an article I wrote。
jvidinwx3#
你漏掉的一个大问题是整数溢出。这包括来自有符号表达式溢出的未定义行为,以及定义良好但可能危险的无符号溢出行为,该行为被减少mod
TYPE_MAX+1
。特别是,如果count
来自一个潜在的不受信任的源(如数据文件),特别是如果sizeof *foo
很大,那么像foo=malloc(count*sizeof *foo);
这样的东西可能非常危险。其他一些人:
char
(否则您可能需要unsigned char
,或者在极少数情况下,signed char
)。/POWER_OF_2
和%POWER_OF_2
(提示:(-3)%8==-3
但(-3)&7==5
)。