zoukankan      html  css  js  c++  java
  • Clang Static Analyzer

    Clang Static Analyzer - 静态代码分析工具

    LLVM不仅仅是一个编译器,同时提供了模块化的功能和库,用于编译器的开发和功能扩展。常规的一个编译器分为前端、优化器和后端,LLVM编译器也不例外,Clang就是属于一个编译器的前端部分,LLVM属于优化器和后端,当然LLVM也可以支持其他类型的前端,比如GCC前端编译器。

    基础扩展

    1.传统编译器是一个三层模型结构,包括前端编译器、优化器、后端编译器。

    • 前端主要负责源代码的编译解析、错误检查以及生成抽象语法树。
    • 优化器主要负责对语法树的优化,以提高代码的运行时间,比如消除冗余计算等。
    • 后端主要负责将优化后的中间代码转成机器码,这个阶段会针对不同的机器架构、指令集优化以提高代码的执行性能。

    2.LLVM是Low Level Virtual Machine的首字母缩写。 本来是一个低级别的虚拟机,但现在它是一种编译器的基础程序集合,包括一些LLVM中介码、LLVM除错工具等,它利用虚拟技术(中介码)为开发语言的编译期、链接期、运行期以及闲置期提供了优化和改良。

    3.Clang是一个前端编译器,Clang只支持C家族的三门语言C、C++和Objective-C,相比于GCC,Clang的优势在于速度快、内存占用体积小、模块化、诊断信息可读性强、设计清晰扩展性强等。

    4.静态检查工具说明

    • scan-build: 运行分析器的高级命令行工具。
    • scan-view: 查看scan-build生成的分析结果。

    clang安装

    1.apt安装

    sudo apt-get install clang
    sudo apt-get install llvm
    

    注意:如果这样安装完成后执行scan-build提示没有此命令,需要单独将scan-build安装或改用下面两种方式安装。

    2.官网下载整包安装

    在llvm的官网 可以查看已经编译好的各个平台的release版本,Clang也会作为llvm release的一部分一起发布

    3.源码编译安装

    参考官网 上的步骤,下载源码后配置一下cmake,编译、安装即可。

    可以先安装一些可能用到的工具:

    sudo apt install gcc
    sudo apt install g++
    sudo apt install make
    sudo apt install cmake 
    

    使用

    static analyzer的实质是提供了一个fake compiler,在真正的compile完成之后,进行analyzer

    1.安装好后, make 之前加上 scan-build 就可以了。

    scan-build --use-analyzer `which clang` make
    
    • scan-build 需要指定 clang 的路径。所以需要设置--use-analyzer
    • 使用-o选项,可以指定输出报告的存放位置。默认是/tmp目录下。

    2.结合autoconf,cmake等工具扫描实际项目

    scan-build ./configure
    scan-build make
    
    cmake -DCMAKE_C_COMPILER=ccc-analyzer -DCMAKE_CXX_COMPILER=c++-analyzer ..
    

    3.checker-检查规则

    内置的 checker 存放在 ../llvm/tools/clang/lib/StaticAnalyzer/Checkers 目录下。 这些 checker默认情况下并没有全部开启,所以需要根据情况启用合适的 checker。可以使用-enable-checker-disable-checker开启和禁用具体的 checker 或者某种类别的 checker。

    如:

    scan-build -enable-checker alpha.security.ArrayBoundV2 ... # 启用数组边界检查
    

    4.相关参数

    $scan-build
    usage: scan-build [-h] [--verbose] [--override-compiler] [--use-cc <path>]
                      [--use-c++ <path>] [--intercept-first] [--status-bugs]
                      [--exclude <directory>] [--output <path>] [--keep-empty]
                      [--html-title <title>] [--plist | --plist-html]
                      [--use-analyzer <path>] [--no-failure-reports]
                      [--analyze-headers] [--stats] [--internal-stats]
                      [--maxloop <loop count>] [--store <model>]
                      [--constraints <model>] [--analyzer-config <options>]
                      [--force-analyze-debug-code]
                      [--load-plugin <plugin library>]
                      [--enable-checker <checker name>]
                      [--disable-checker <checker name>] [--help-checkers]
                      [--help-checkers-verbose]
                      ...
    scan-build: error: missing build command
    

    查看结果

    1.若代码存在问题,会生成html报告,否则不生成。

    2.生成成功后,可在浏览器直接打开查看,也可以使用scan-view命令进行查看。

    3.生成位置若不指定则在/tmp下。

    静态检查知识补充

    使用静态分析库有几个注意点:

    • 持续更新,不断优化
      代码检查库一直计划提升代码检查的精确度和范围,优化查找bug的方式,对于静态代码检查有一些基本的限制,可优化的空间还有很大.
    • 比编译耗时
      使用静态代码检查自动查找程序bug其实是使用CPU时间来换更高的代码质量.静态分析要比编译耗时.
      即使Clang在速度和轻量级上尽可能进行了优化,但是也不要期待会比项目编译更快.一些用于查找bug的代码最差时需要指数级的时间消耗.
    • 检测失误
      静态检测并不是完美的,可能正确的代码也会出现一些错误的bug提示,因为不同代码需要的检查精度不同,我不同的检查规则中,可能会出现不同频率的检测失误,Clang一直在尽力减少这种失误,但目前并没有完全避免.
    • 并未100%覆盖全部bug
      静态检查只是找到了那写常见的特定bug,但是对于某些bug还未覆盖.

    常见问题

    1.Clang开源的代码检查库更新比较频繁,会有更多的bug提示和代码检查.所以使用最新的检查库,可以带来更全面的检查,以提高代码质量和健壮性。

    参考:

    1.scan-build:从命令行运行分析器

    2.llvm, clang 和 scan-build 的安装和使用

    3.Clang Static Analyzer

    感谢阅读,如有问题,请批评指正,谢谢。
  • 相关阅读:
    深度学习丨Deep Learning学习资源整理
    机器学习丨《机器学习》、《统计学习方法》思维导图
    概率统计丨陈希孺《概率论与数理统计》思维导图
    数据科学丨DataScience工具速查卡
    线性代数丨《线性代数及其应用》思维导图
    Api接口加密策略
    tomcat重启警告:Abandoned connection cleanup thread 服务器宕机解决方案
    spring mvc多环境下配置文件的设置
    mysql中将查询结果进行拼接处理及concat、group_concat的使用
    JVM优化之 -Xss -Xms -Xmx -Xmn 参数设置
  • 原文地址:https://www.cnblogs.com/clwsec/p/13939488.html
Copyright © 2011-2022 走看看