技术分享|Clang Static Analyzer Checker简介
Posted 小米安全中心
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了技术分享|Clang Static Analyzer Checker简介相关的知识,希望对你有一定的参考价值。
注:本文为“小米安全中心”原创,转载请联系“小米安全中心”
上期回顾:
背景
Clang Static Analyzer是开源编译器前端clang中内置的针对C,C++和Objective-C源代码的静态分析工具,能提供普通warning之外的检查,涵盖内存操作,安全等方面。这部分功能可通过clang --analyze命令或者库文件等方式调用。
结构和使用
整体来看clang static analyzer分为两部分,分析引擎(analyzer core)和checkers,所有checker的运行都建立在底层分析引擎的基础之上。增加新的检查,大多是使用分析引擎提供的功能编写新的checker。
用户可以通过clang --analyze -Xclang -analyzer-checker-help来列举当前clang版本下所有包含的checker列表,这些checker按类型被分组。默认情况下alpha分组的不会被执行,要明确包含某个分组可通过-analyzer-checker参数指定,例如调用alpha分组checker,需要执行:
clang --analyze -Xclang -analyzer-checker=alpha <file>
详细的checker列表和简要的说明可以在
http://clang-analyzer.llvm.org/available_checks.html中找到。
除了正常功能的checker,debug分组的checker可以帮助开发者了解分析引擎在处理源代码过程中的逻辑,例如以下一些checker:
Checker代码实例
Clang/llvm项目编译方面的步骤可参看官方文档。关于checker的编写,clang项目下StaticAnalyzer/Checkers目录中有不少实例可以参考。这里用一个最简单的例子来熟悉checker的创建:FixedAddressChecker,这个checker将检查出所有直接向指针赋值常量的操作并报警。
准备工作:
所有自定义的checker类都需要继承Checker模板类,并通过实现不同的事件注册函数来挂钩analyzer core分析过程,所有支持的事件类型可以在中查阅。FixedAddressCheck类通过实现checkPreStmt函数捕捉代码中的赋值操作,下面是加上注释的代码:
这就完成了一个简单checker的实现,通过测试用例test.c,运行该checker可以看到相应的输出结果:
看了FixedAddressChecker例子之后,可继续查看其他的一些实例,参考文档[3]以官方StreamChecker为例,给出了针对文件流操作checker的整个设计和编写过程,当然目前StreamChecker和2012年PPT中所描述的相比有所变化,但大体思路没有变。
后话
clang static analyzer通过建立分析引擎和checkers所组成的这种架构,将编写自定义checker的难度有所简化,方便二次开发。当然要编写出低误报,低漏报的checker还需更深入的了解分析引擎本身和熟悉其提供的各类接口。
Reference:
[1]
[2]
[3]
[4]
注:本文为“小米安全中心”原创,转载请联系“小米安全中心”
↓↓↓请点击"阅读原文",登录小米安全中心技术分享版块
以上是关于技术分享|Clang Static Analyzer Checker简介的主要内容,如果未能解决你的问题,请参考以下文章
#盲盒+码# Clang Static Analyzer scan-build
软件漏洞检测(Bug Finding):Clang Static Analyzer(进阶与实战)
软件漏洞检测(Bug Finding):Clang Static Analyzer(进阶与实战)