靜態檢查工具——Clang【含自動化檢測方法】


簡介:

  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

  安裝完成后,輸入: 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()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM