首页 > 代码库 > Clang &IOS 静态代码分析工具scan-build

Clang &IOS 静态代码分析工具scan-build

 

  • Author:Echo Chen(陈斌)

  • Email:chenb19870707@gmail.com

  • Blog:Blog.csdn.net/chen19870707

         Date:Jan.4th, 2015

     

    IOS项目和Clang项目可以借助scan-build 实现代码的静态分析,找出代码缺陷。

     

    1.什么是 Scan-build?

    Scan-build 是一个命令行工具,它能够帮助使用者运行静态分析器检查他们的代码, 找出代码的缺陷。

    2.scan-build是怎么工作的?

    当一个项目在构建中,源文件在编译时同时也被静态分析器有序的检查着。当构建完成时,结构将会作为一个web网页的形式呈现给使用者。

    3.scan-build工作时需要哪些编译环境呢?

     

  • 你如何编写代码与scan-build是没有任何关系的。通过重写cc和cxx环境变量来改变你的编译环境,scan-build可以使用一个伪编译器代替原来那个可以正常构建你的项目的编译器。默认情况下,这个伪编译器使用gcc来编译你的代码,然后执行静态分析器进行代码分析。

  • 人为的一些操作在很多情况下都会有些好的或坏的影响。请查询scan-build的帮助文档,它会告诉你在上面的情况下,如何使其正常工作。

  • scan-build命令从本质上介入到工程的构建过程中,分析整个工作。这就意味着,在工作构建过程中, scan-build通过gcc来分析已经编译了的源文件。也就是说,没有被编译的文件是不会被分析的。

     

    4.基本使用

     

           scan-build的基本使用方式很简单,只需在你的命令行开头输入scan-build即可。

    技术分享

       首先, scan-build使用make命令分析已构建的工作代码,然后scan-build使用xcodebuild命令分析已构建的工程。

     

       下面是scan-build命令的通用格式:

    技术分享

     

    scan-build 会逐个运行这些命令,其参数也是按顺序执行。例如,在make命令中传入一个 -j4 的参数,结果是一个4核的并行编译操作。

    技术分享

     

    在大多数情况下, 构建命令完成后,scan-build是不会再处理参数。总之,scan-build应支持并行构建,而不是分布式构建。

    当然我们可以用scan-build来分析具体的文件:

    技术分享

     

    这个命令实现对t1.c 和 t2.c 文件的分析。
           其它参数像上面所提到的,scan-build能够处理一些额外的参数。有些参数作为命令的前缀。

     

    例如:

    技术分享

    下面是一些常用的参数:
    -o html 报告文件的存放目录。可以按需要创建一些子目录,来区分每个运行的分
    析器。如果没有指定这个参数,默认将报告文件保存在/tmp目录里。
    -h 显示scan-build的所有参数
    -k 增加一个继续运行的参数到具体的命令中
    -v 冗余输出结果。可以选择2个或3个”-v”增加冗余度。
    -V 当命令完成后,在浏览器中查看运行结果。

    5.scan-build的输出结果

     

    scan-build的输出结果是一个HTML文件集合,每个html文件代表一个独立的缺陷报告。 index.html文件是用来查询所有的缺陷。你可以用浏览器打开index.html文件查看所有缺陷报告。
            html报告文件的存放是油-o参数指定的,默认是保存在/tmp目录下。scan-build会打印出报告所在路径。如果你想在命令执行完后立即去查看报告,那么你应该传入一个-V参数。

    6.高级使用

     

    大多数工程能在debug模式下构建,并支持断言功能。静态分析器执行断言来删改不可执行的路径,在许多情况下这可以大量减少由工具所产生的伪错误报告。
             scan-build使用-v参数来产生冗余的输出;两个-v参数产生更多的信息。重定向scan-build的输出到一个文档中对填写缺陷报告非常有用,因为我们可以清楚的知道具体传入给分析器的参数。为了更多和更综合的日志,不要用并行构建。

    6.1 在scan-build中运行./configure

     

                 如果一个已经分析了的工作使用脚本自动生成配置信息,那么你很可能需要通过scan-build运行配置脚本,以此来分析工程。
               例如:

     

    技术分享

     

                这个配置脚本需要在 scan-build中运行是因为 scan-build能通过介入到编译器来扫描你的源文件。 scan-build将环境变量cc设置为ccc-analyzer。ccc-analyzer作为一个伪编译器,转发命令行参数给gcc和clang来执行静态分析。

     

    6.2 分析iPhone 工程

     

    概率上iPhone应用程序和桌面应用程序很相似。scan-build也能分析这些工程,但是用户在构建命令行iPhone工程时会遇到一些问题,因为缺少一些额外的预备步骤(例如建立代码签名)。

     

    6.3 推荐:使用”Build and Analyze”

     

    分析iPhone工程最简单的方式是使用Build and Analyze feature in Xcode3.2(基于Clang的静态分析器)。这样用户只需要点击一个按钮就能实现这些功能而不用下面所描述的操作。

    官方网站上会有这方面的功能介绍。

     

    6.4 直接使用 scan-build

     

      • 在debug模式下分析你的工程,要么在xcode中设置这个属性,要么用-configuration Debug参数给xcodebuild设定属性。

      • 用模拟器分析你的工程。当链接了设备时是可以分析你的代码的,但是这只是对使用”Build and Analyze feature”时更方便些。

      • 检查你的代码签名是否也设置到模拟器中,确保这个选项是Don’t Code Sign。

      • 如果你的iPhone系统是2.2,你可以运行 scan-build用以下命令行方式。技术分享

     

    同样,如果你的iPhone系统是3.0

                              技术分享

     

    6.5 使用合适的编译器

     

    回想一下, scan-build分析工程时是用gcc编译工程,用clang分析工程。当分析iPhone工程时, scan-build也许会选择错误的编译器而非xcode用来构建工程的编译器。这是因为你的系统中可能安装了多个gcc的版本,尤其是你在做iPhone开发时。
            当你使用Mac OS 10。5(Leopard) 来开发iPhone OS 3。0程序时,就会产生这样的问题。默认的雪豹编译器是gcc-4。0,但是iPhone OS 3。0的却是gcc-4。2。当在模拟器中编译你的应用程序时, scan-build使用正确的gcc版本是非常和重要的,否则你会看到一些奇怪的编译错误。
            scan-build提供 –use-cc和—use-c++选项。注意,虽然你主要的兴趣是分析你的工程,但请注意分析器与构建过程密切相关,不能编译的代码是不能够被分析到的。如果你不确定编译器xcode所使用的版本,试着就运行xcodebuild。你会看到完整的xcode所使用的编译器路径,通过使用- -use-cc参数。

     

    -

  • Echo Chen:Blog.csdn.net/chen19870707

    -

  • Clang &IOS 静态代码分析工具scan-build