技术分享|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将检查出所有直接向指针赋值常量的操作并报警。


准备工作: 

技术分享|Clang Static Analyzer 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简介的主要内容,如果未能解决你的问题,请参考以下文章

SDAP接入Clang Static Analyzer

#盲盒+码# Clang Static Analyzer scan-build

软件漏洞检测(Bug Finding):Clang Static Analyzer(进阶与实战)

软件漏洞检测(Bug Finding):Clang Static Analyzer(进阶与实战)

软件漏洞检测(Bug Finding):Clang Static Analyzer(进阶与实战)

ld:在带有 gcc/clang -static 标志的 OSX 10.6 上找不到 -lcrt0.o 的库