C++静态分析与构建:Infer @GN/Ninja
1 引子
本文的目的是通过分析Infer静态分析工具和Ninja构建系统,以及前者对后者的支持状况,来推动具有相关需求的业务部门合作,一起来完成Infer对于Ninja构建系统的支持。
本文源于如下问题:
infer不支持gn/ninja 的构建系统的C++代码分析
2 Infer
Infer是一个静态代码的分析工具,它是Facebook与开源贡献者团队共同开发的,提供对Java, c, c++和objective c的支持,它已经被部署在Facebook自家的Android和iOS的应用上,这包括像whatsapp, Instagram, Messenger,Facebook主应用程序等程序的分析当中。
Infer比较著名的用户有spotify,Uber,Mozilla,Sky等。
这个工具的检查范围包括:
1. 对安卓和Java代码中的空指针异常, 资源泄露,注解的可达性, 缺失的锁防护和并发竞争条件。
2. 对c,c++和objective c中的空指针检查,内存泄漏,编码约定以及不可用的API。
2.1 Infer案例
2.1.1 c
hello.c
// hello.c
#include <stdlib.h>
void test() {
int *s = NULL;
*s = 42;
}
2.1.1.1 统计
{ "files": 1, "procedures": 0, "lines": 0 }
2.1.1.2 报告:
[
{
"bug_type": "NULL_DEREFERENCE",
"qualifier": "pointer `s` last assigned on line 5 could be null and is dereferenced at line 6, column 3.",
"severity": "ERROR",
"line": 6,
"column": 3,
"procedure": "test",
"procedure_start_line": 4,
"file": "c++/hello.c",
"bug_trace": [
{
"level": 0,
"filename": "c++/hello.c",
"line_number": 4,
"column_number": 1,
"description": "start of procedure test()"
},
{
"level": 0,
"filename": "c++/hello.c",
"line_number": 5,
"column_number": 3,
"description": ""
},
{
"level": 0,
"filename": "c++/hello.c",
"line_number": 6,
"column_number": 3,
"description": ""
}
],
"key": "hello.c|test|NULL_DEREFERENCE",
"node_key": "df5c83dfdfb79926d42976bfa5b88b70",
"hash": "301fe6dc79c8b712f7db53035edca5c6",
"bug_type_hum": "Null Dereference"
}
]
2.1.2 java
Hello.java
// Hello.java
class Hello {
int test() {
String s = null;
return s.length();
}
}
2.1.2.1 统计结果:
{ "files": 1, "procedures": 0, "lines": 0 }
2.1.2.2 报告:
[
{
"bug_type": "NULL_DEREFERENCE",
"qualifier": "object `s` last assigned on line 4 could be null and is dereferenced at line 5.",
"severity": "ERROR",
"line": 5,
"column": -1,
"procedure": "Hello.test():int",
"procedure_start_line": 3,
"file": "Hello.java",
"bug_trace": [
{
"level": 0,
"filename": "Hello.java",
"line_number": 3,
"column_number": -1,
"description": "start of procedure test()"
},
{
"level": 0,
"filename": "Hello.java",
"line_number": 4,
"column_number": -1,
"description": ""
},
{
"level": 0,
"filename": "Hello.java",
"line_number": 5,
"column_number": -1,
"description": ""
}
],
"key": "Hello.java|test|NULL_DEREFERENCE",
"node_key": "c8c6b1f0f8892a67c957e59c27c08c9f",
"hash": "f21e4baf23b546897421c6f1f10c2e78",
"bug_type_hum": "Null Dereference"
}
]
3 Ninja
Ninja是一个针对c++语言的小型快速的构建系统。有两个显著特点,第1个特点是它的输入文件由更高级别的构建系统生成, 这些构建系统如gyp,cmake,meson和gn。第2个特点是追求构建速度的极致。
我们非常熟悉的一个构建系统是Make,Make的功能非常强大,但是在做增量构建的时候速度非常缓慢。当你的系统包含大量源文件的时候,使用Ninja,编译的速度会大大的提升。
3.1 Ninja案例
3.1.1 文件结构:

3.1.2 使用GN生成Ninja输入
../../out/gn gen -C out

3.1.3 使用Ninja编译
ninja -C out

3.1.4 运行结果:
./out/hello
Hello, world
4 Infer和Ninja
目前 Infer官方支持的构建系统有ant, buck, cc, gradle, java, javac, make, mvn, ndk-build, xcodebuild。在此时此刻还不支持Ninja。
在Infer的官方网站上有下面的ticket, 要求提供对Ninja构建系统的支持。
Add support for ninja build system #1071:
https://github.com/facebook/infer/issues/1071
failed to work with ninja #1028
https://github.com/facebook/infer/issues/1028
可能的代码修改参考:
- 点赞
- 收藏
- 关注作者
评论(0)