如何检查C源文件是否缺少返回错误检查?

时间:2014-08-25 19:14:57

标签: c error-handling static-analysis

假设你有这样的代码:

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 -Wallcppcheck --enable=all不会发出任何警告。

Hovewer省略检查mallocforkexecve的错误返回值,这显然会导致问题。如何静态检查C源代码是否存在此类错误?

3 个答案:

答案 0 :(得分:1)

如果找不到专门的解决方案,我会转向findgrep来搜索每次调用malloc,以及您认为重要的任何其他函数来检查返回值。我会一次检查每一个并用我的眼睛快速扫描结果。

find . -type f -name '*.[ch]*' -exec grep -HnA2 'malloc' {}  \; 

如果您怀疑两行以上的尾随上下文更适合捕获返回值测试,请将传递给grep的A2增加到A3

答案 1 :(得分:1)

我开发了Cppcheck

如果Cppcheck在malloc之后警告每个丢失的NULL指针检查它会写入误报。一些/大多数人假设/知道永远不会有内存不足,因此malloc的返回值不会被设计检查。

我相信对某些人来说,检查这个会很有用。如果有人想在Cppcheck中有这个...我反对把它放在Cppcheck本身。我建议改为编写插件(脚本)或规则(正则表达式)。我可以将它添加到存储库中。那些想要这个的人可以使用那个插件/规则。

答案 2 :(得分:0)

因此,您希望根据(隐式)编码规则检查源代码。我假设您使用最近的gcc编译器进行编译...

如果源代码很大,可以在GCC中编写自己的MELT扩展名,这是一种特定于域的语言和插件来扩展GCC。然而,这需要一些(数周)的工作。