简介:

下的C/C++/Objective-C/Objective-C++编译器。它与GNU C语言规范几乎完全兼容,并在此基础上增加了额外的语法特性,其目标(之一)就是超越GCC。 我们平时说的Clang工具,实际上基于是Clang编译环境下的,用于静态代码分析的命令行工具:scan-build。

  工具原理:scan-build是一个命令行应用程序,它使用户能够运行静态分析器。 在一个项目生成过程中,当源码文件被编译时,它们也被静态分析器一个接一个地分析。生成完成,结果就会由Web浏览器呈现给使用者。 scan-build命令从本质上介入到工程的生成过程中,分析整个项目。也就是说,没有被编译的文件是不会被分析的。

  工具类型:静态工具。

  支持平台:Linux。

  使用方法:scan-build

  输出文件:输出到指定目录下*.html,会根据目录结构保存结果。

  查看问题:使用浏览器打开*.html(index.html),可看出检测出问题的位置,及相关调用时序。

 

检查范围:

  Clang可以理解为一个更加严苛的编译器。最主要的任务是词法分析。 

 

下载安装:

  编译 Clang 要求您的系统中安装有 C++ 编译器 ( 如 GCC)。如果您还要编译 Clang 的测试集,还需要先安装 python。

  Linux-pc 环境下,cmd 输入:sudo apt install clang

  安装完成后,输入:scan-build, 会有提示各种参数说明即代表安装完成。

 

使用方法:

   只需在你的命令行开头输入scan-build即可,如:scan-build make

 

  或者分析单个文件:scan-build gcc -c main.cpp

 

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

    scan-build [scan-build options] <command> [command options]

 

  下面是一些常用的参数:

    -o html 报告文件的存放目录,如果没有指定这个参数,默认将报告文件保存在/tmp目录下

    -h 显示scan-build的所有参数

    -k 增加一个继续运行的参数到具体的命令中

    -v 冗余输出结果。可以选择2个或3个”-v”增加冗余度。

    -V 当命令完成后,在浏览器中查看运行结果。

输出结果:

   scan-build的输出结果是一个HTML文件集合,每个html文件代表一个独立的缺陷报告。 index.html文件是用来查询所有的缺陷。

        html报告文件的存放是由-o参数指定的,默认是保存在/tmp目录下。

进阶:clang自动化检查

  介绍:编写脚本定期进行clang检查,出现缺陷报告时自动发送邮件通知。

  优点;节约对工程进行clang检查的人工成本。

  缺点:检查代码的终端不可关机。

实现:

  需要编写两个脚本,【Clang】用于定期进行clang检查;【eml.py】另一个用于自动发送邮件。

  【Clang】:

  

scan-build make                 //检查工程 
    if [ -d "/tmp/ index.html" ];           //判断是否产生缺陷报告
    then zip -r /tmp/ index.zip /tmp/ index.html;   //将缺陷报告文件打包
    python eml.py;                //发送缺陷报告
    rm -rf  /tmp/ index.zip;              //删除打包文件
    rm -rf  /tmp/ index.html;            //删除缺陷报告
    fi        sleep 24h                    //检查间隔时间
    ./Clang                     //再次检查

  【eml.py】:    

#coding:utf-8
 #文件不能命名为email.py,否则找不到email.mime.text
import sys
reload(sys)
sys.setdefaultencoding('utf8')
import smtplib
#from smtplib import SMTP
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header

msg = MIMEMultipart()
#构造邮件头
msg['From'] = Header('么么哒<发件人邮箱地址>','utf-8')
#msg['To'] = Header('管理员','utf-8')
subject = 'Clang Find Bug邮件'
msg['Subject'] = Header(subject,'utf-8') #构造纯文本邮件内容
msg.attach(MIMEText('hello,find problem!Come on!!!','plain','utf-8'))#构造附件压缩文件内容
att1 = MIMEText(open('/tmp/ index.zip', 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'att1["Content-Disposition"] = 'attachment; filename="Clang.zip"'
msg.attach(att1)#发送者邮箱
sender = '发件人邮箱地址'

#发送者的登陆用户名和密码
user = 发件人邮箱地址'
password = '发件人邮箱码'

#发送者邮箱的SMTP服务器地址
smtpserver = '发送者邮箱的SMTP服务器地址'

#接收者的邮箱地址
receiver = ['接收者的邮箱地址'] #receiver 可以是一个list

smtp = smtplib.SMTP() #实例化SMTP对象
smtp.connect(smtpserver,25) #(缺省)默认端口是25 也可以根据服务器进行设定
smtp.login(user,password) #登陆smtp服务器
smtp.sendmail(sender,receiver,msg.as_string()) #发送邮件 ,这里有三个参数
'''
login()方法用来登录SMTP服务器,sendmail()方法就是发邮件,由于可以一次发给多个人,所以传入一个list,邮件正文
是一个str,as_string()把MIMEText对象变成str。
'''
smtp.quit()