是否有任何工具可以在C源代码中找到潜在的错误?

时间:2018-11-21 01:06:00

标签: c gcc gcc-warning

例如,我有一些这样的代码:

GIT_MERGE_AUTOEDIT=no git merge origin/master

该代码可以运行,但是有一个潜在的错误,#include<stdio.h> #include<stdlib.h> #include<string.h> char *func(char *p) { p = malloc(32); memcpy(p, "hello", 6); return p; } int main() { char *s = NULL; char *s2 = NULL; s2 = func(s); printf("%s\n", s2); free(s2); return 1; } 不会指向s(假设程序员的意图是为s分配内存)。因为它很简单,所以可以快速找到该错误。但是在一个包含许多代码的大型项目中,有时很难找到这样的错误。 *p不发出警告。

是否有任何工具可以找出这种错误?

1 个答案:

答案 0 :(得分:1)

除了深不可测的变量名之外,该代码实际上几乎没有什么错误:-)

s副本p的形式传递给函数,您更改p然后返回,最后将其分配给s2 。在没有点,s(或ps2)的使用方式会导致未定义的行为,除非malloc失败,否则是您应该考虑的事情:

p = malloc(32);
if (p != NULL) memcpy(p, "hello", 6); // why not str[n]cpy ?

但是,就可以用来发现问题的工具而言,有很多。例如,lint,具有良好诊断方法的编译器,valgrind之类的内存跟踪器和gdb之类的调试器。


到目前为止,最重要的工具是您头骨中的湿件,尤其,其中还添加了:

  

假设程序员的意图是为s分配内存。

我可以想到 no 在这种情况下会抓住程序员意图的其他工具。弄清楚意图是在代码声明时在变量中添加两个,这没有什么不同:

i++;