例如,我有一些这样的代码:
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
不发出警告。
是否有任何工具可以找出这种错误?
答案 0 :(得分:1)
除了深不可测的变量名之外,该代码实际上几乎没有什么错误:-)
s
的副本以p
的形式传递给函数,您更改p
然后返回,最后将其分配给s2
。在没有点,s
(或p
或s2
)的使用方式会导致未定义的行为,除非malloc
失败,否则是您应该考虑的事情:
p = malloc(32);
if (p != NULL) memcpy(p, "hello", 6); // why not str[n]cpy ?
但是,就可以用来发现问题的工具而言,有很多。例如,lint,具有良好诊断方法的编译器,valgrind
之类的内存跟踪器和gdb
之类的调试器。
到目前为止,最重要的工具是您头骨中的湿件,尤其,其中还添加了:
假设程序员的意图是为s分配内存。
我可以想到 no 在这种情况下会抓住程序员意图的其他工具。弄清楚意图是在代码声明时在变量中添加两个,这没有什么不同:
i++;