C++静态分析与构建:Infer @GN/Ninja

举报
Jet Ding 发表于 2020/09/28 18:24:49 2020/09/28
【摘要】 1 引子本文的目的是通过分析Infer静态分析工具和Ninja构建系统,以及前者对后者的支持状况,来推动具有相关需求的业务部门合作,一起来完成Infer对于Ninja构建系统的支持。本文源于如下问题:infer不支持gn/ninja 的构建系统的C++代码分析2 InferInfer是一个静态代码的分析工具,它是Facebook与开源贡献者团队共同开发的,提供对Java, c, c++和o...

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    文件结构:

image.png

3.1.2    使用GN生成Ninja输入

../../out/gn gen -C out

 

image.png

 

3.1.3    使用Ninja编译

ninja -C out

 

image.png

 

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

可能的代码修改参考:

https://github.com/facebook/infer/blob/0bef279ed1f87ed55d845b312d9d63028a56cad1/infer/src/integration/CompilationDatabase.ml#L128-L131


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。