ClangIOS静态代码分析⼯具scan-build
Author:Echo Chen(陈斌)
Email:chenb19870707@gmail
Blog:
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 ⼯程如何查看html代码
概率上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:
-
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论