簡介:
Clang是一個C++編寫、基於LLVM、發布於LLVM BSD許可證下的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
-h 顯示scan-build的所有參數
-k 增加一個繼續運行的參數到具體的命令中
-v 冗余輸出結果。可以選擇2個或3個”-v”增加冗余度。
-V 當命令完成后,在瀏覽器中查看運行結果。
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()