假设你有这样的代码:
int* a = (int*) malloc(20);
a[3]=2;
pid_t q = fork();
if(!q) {
char *a[5];
for (q=4; ;--q) {
if(q<0) break;
a[q]="q";
}
execve("q", a, NULL);
}
if(q) kill(q, 9);
free(a);
使用gcc -Wall
构建时没有任何警告,clang -Wall
,cppcheck --enable=all
不会发出任何警告。
Hovewer省略检查malloc
,fork
和execve
的错误返回值,这显然会导致问题。如何静态检查C源代码是否存在此类错误?
答案 0 :(得分:1)
如果找不到专门的解决方案,我会转向find
和grep
来搜索每次调用malloc,以及您认为重要的任何其他函数来检查返回值。我会一次检查每一个并用我的眼睛快速扫描结果。
find . -type f -name '*.[ch]*' -exec grep -HnA2 'malloc' {} \;
如果您怀疑两行以上的尾随上下文更适合捕获返回值测试,请将传递给grep的A2
增加到A3
。
答案 1 :(得分:1)
我开发了Cppcheck
如果Cppcheck在malloc之后警告每个丢失的NULL指针检查它会写入误报。一些/大多数人假设/知道永远不会有内存不足,因此malloc的返回值不会被设计检查。
我相信对某些人来说,检查这个会很有用。如果有人想在Cppcheck中有这个...我反对把它放在Cppcheck本身。我建议改为编写插件(脚本)或规则(正则表达式)。我可以将它添加到存储库中。那些想要这个的人可以使用那个插件/规则。
答案 2 :(得分:0)