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)