让你的checker出现在clang的checker list中

生成LLVM文件之后,做下面两件事,我们差不多就终于可以开始我们正式的编写checker之旅了。

1. clang,can-build,scan-view,ccc-analyzer全部添加正确的系统路径

2. 安装windows下的Perl64解释器并添加系统路径

到这里差不多就可使用了,我们来测试一下:

clang --help
clang -cc1 -analyzer-checker-help    (列出所有可用的checker)

下面我们给出一段测试程序

char * test_fixed_address_checker()
{
    char *p;
    p = 0x1000;
    return p;
}

将它保存为test.c,并放在桌面上,方便我们测试(强迫症者除外),然后我们打开cmd,复制粘贴下面三行:

cd desktop
type test.c
clang --analyze -Xclang -analyzer-checker=alpha.core.FixedAddr test.c

结果为:

下面我们来试下scan-build

scan-build --use-analyzer=D:\LLVM\build\Debug\bin\clang.exe clang -cc1 test.c

--use-analyzer=D:\LLVM\build\Debug\bin\clang.exe 中--use-analyzer 就是要告诉系统一个可用的clang的位置,也就是我们配置的clang 的环境变量path的值。

实践测试了代码之后,我们来DIY吧!下面来写自己的checkers。我就按照自己放置的路径分享了,大家可以对照自己的做调整:

1. 打开D:\LLVM\llvm\tools\clang\lib\StaticAnalyzer\Checkers

2. 添加自定义的.cpp 的checker文件,比如:MyDefinedChecker.cpp

并在该文件中添加注册函数:

void ento::registerMyDefinedChecker(CheckerManager &mgr) {
  mgr.registerChecker<MyDefinedChecker>();
}

千万别像我一样傻,除了上面的代码什么都不往里面放,就想要皆大欢喜,实际是要放下下面这一段试试的,因为第一步你要在VS中没有便宜错误,之后还不能有链接错误,所以虽然没有实际内容,请放下面的内容:

#include "ClangSACheckers.h"
#include "clang/StaticAnalyzer/Core/BugReporter/BugType.h"
#include "clang/StaticAnalyzer/Core/Checker.h"
#include "clang/StaticAnalyzer/Core/CheckerManager.h"
#include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h"

using namespace clang;
using namespace ento;

namespace {
    class MyDefinedChecker
        : public Checker< check::PreStmt<BinaryOperator> > {
        mutable std::unique_ptr<BuiltinBug> BT;

    public:
        void checkPreStmt(const BinaryOperator *B, CheckerContext &C) const;
    };
}

void MyDefinedChecker::checkPreStmt(const BinaryOperator *B, CheckerContext &C) const
{
}
void ento::registerMyDefinedChecker(CheckerManager &mgr) {
  mgr.registerChecker<MyDefinedChecker>();
}

3. 在D:\LLVM\llvm\tools\clang\include\clang\StaticAnalyzer\Checkers中找到Checkers.td文件,在Checkers.td文件中为自己的checker添加分组信息,也就是说你要让自己的checker继承自哪一类,差不多在159行左右,大家把自己的checker放在下图的这个package里面:CoreAlpha

代码为:

def MyDefinedChecker : Checker<"MyDefined">,HelpText<"Check for a self-defined error">,
  DescFile<"MyDefinedChecker.cpp">;

4. 最后在D:\LLVM\llvm\tools\clang\lib\StaticAnalyzer\Checkers的CMakeLists.txt中添加类名.cpp,比如:MyDefinedChecker.cpp放在59行,因为貌似是按照字母顺序表来的。

现在打开LLVM.sln, 在解决方案中搜索刚写的checker名,找到自己的源文件,检查是否有错误,如果没有,注意点击该源文件所属的项目,只生成这个项目即可,否则会很费时间,特别慢,特别卡,要崩溃的感觉。

现在来测试一下:

还不错的感觉哦,哈哈!

如果效果不是上图所示,可以右击clang这个项目,点击生成,就会把变化的内容重新编译,如果存在连接问题,如果是LINK2019,可能是只写了函数声明,没有定义。

今天就啰嗦这么多吧,下一节,我们会简单介绍如何真正开始写一些自己经过设计的checker。

参考文章:

http://blog.csdn.net/tuqinag/article/details/46940633

https://sec.xiaomi.com/article/21

时间: 2024-07-31 14:32:10

让你的checker出现在clang的checker list中的相关文章

[js]uploadify结合jqueryUI弹出框上传,js中的冒出的bug,又被ie坑了

引言 最近在一个项目中,在用户列表中需要对给没有签名样本的个别用户上传签名的样本,就想到博客园中上传图片使用弹出框方式,博客园具体怎么实现的不知道,只是如果自己来弄,想到两个插件的结合使用,在弹出框中使用uploadify插件进行上传,每次都会报错很是无语,最后找到解决方案,这里记录一下,算是对工作中遇到的bug的一个总结. bug 这是vs调试状态下,显示的信息.在浏览器端,点击第一次上传按钮,正常,将弹出框关闭后,第二次打开,就会出现问题: 第一次单击上传: 第二次,关闭弹出框,再次单击上传

【C语言】输入一组整数,求出这组数字子序列和中最大值

//输入一组整数.求出这组数字子序列和中最大值 #include <stdio.h> int MAxSum(int arr[],int len) { int maxsum = 0; int i; int j; for (i = 0; i < len; i++) { int thissum = 0; for (j = i; j < len; j++) { thissum += arr[j]; if (thissum>maxsum) maxsum = thissum; } } r

浅入深出之Java集合框架(中)

Java中的集合框架(中) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,如果已经有java基础的小伙伴可以直接跳到<浅入深出之Java集合框架(下)>. 目 录 浅入深出之Java集合框架(上) 浅入深出之Java集合框架(中)   浅入深出之Java集合框架(下) 努力赶制中..关注后更新会提醒哦! 前 言 在<浅入深出之Java集合框架(上)>中介绍了List接口和Set接口的基本操作,在这篇文章中,我将介绍关于Map接口的基

如何过滤出已知当前目录下oldboy中的所有一级目录

第1章 linux启动过程 1.1 linux启动过程(1) 开机自检(BIOS)内存cup是否有问题(硬件检查)(2) MBR引导(3) GRUB菜单(选择不同的内核)(4) 加载内核(kernel)(5) 运行init进程(linux里面的第一个进程,初始化过程)(6) 读取/etc/inittab配置文件(运行级别配置文件)(7) 执行/etc/rc.d/rc.sysinit脚本(系统初始化脚本,设置主机名,设置IP地址)(8) 执行/etc/rc.d/rc脚本(根据系统的云心级别,再开机

找出两个整型数组中的公共元素的最大值

一,问题描述 给定两个整型数组,找出这两个数组中的最大的公共元素.注意条件:①公共元素   ②最大的公共元素 比如:arr1={8,2,9,6,18,7,25,28}   arr2={6,39,4,9,25,18,36,12}.假设 arr1 的长度为M,arr2的长度为N 这两个数组的最大公共元素是:25 二,思路 ①对 arr1 中的每个元素arr1[i],去 arr2 查找是否也存在 该元素,若存在则标记起来,因为它虽然是公共的,但不一定是最大的. 直到扫描完arr1中的所有元素,这种方式

POJ 3294 出现在至少K个字符串中的子串

在掌握POJ 2774(两个串求最长公共子串)以及对Height数组分组后,本题还是容易想出思路的. 首先用字符集外的不同字符连接所有串,这是为了防止两个后缀在比较时超过某个字符串的分界.二分子串的长度,扫描height数组,判定是否有某个分组来源与至少K个原字符串(本题要求出现超过n的一半次). #include <iostream> #include <vector> #include <algorithm> #include <string> #inc

找出数字在已排序数组中出现的次数

一,问题描述 假设给定一个有序的整型数组arr,以及一个整数 k,问 k在数组中出现了几次? 二,求解思路 ①数组是有序的,故可考虑用二分查找 ②如果能找到 k 在数组中第一次出现时的索引位置first_index 和 最后一次出现时的索引位置last_index 就可以知道 k 出现的次数了: (last_index - first_index) + 1 而对于有序数组而言,可以通过二分查找求出某个数第一次出现的索引位置 和 最后一次出现的索引位置.故总的时间复杂度为O(logN) ③特殊情况

java中的文件读取和文件写出:如何从一个文件中获取内容以及如何向一个文件中写入内容

1 2 3 import java.io.BufferedReader; 4 import java.io.BufferedWriter; 5 import java.io.File; 6 import java.io.FileInputStream; 7 import java.io.FileNotFoundException; 8 import java.io.FileOutputStream; 9 import java.io.IOException; 10 import java.io.

新一轮暴富机会将出现在这6个行业中 你准备好了吗

http://money.eastmoney.com/news/1282,20150112466508563_0.html www.eastmoney.com2015年01月12日 08:03 字体:大中小|共1634人参与讨论|用手机讨论 如今,在A股市场上大约只有23家市值达千亿级别的大公司.而据分析人士预计,在互联网时代下,随着互联网金融.云计算.大健康产业及高效生态农业的形成,就会再次产生众多千亿级公司,也即,暴富的机会正在降临. 1.互联网金融 互联网金融是依托支付.云计算.社交网络以