999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于Clang編譯器的程序結構分析器設計

2016-11-30 15:52:32周睿
計算機時代 2016年10期

周睿

摘 要: 國內的軟件測試研究目前還基本停留在比較基礎的理論方法和管理方法上,沒有在軟件測試技術上取得突破。基于當前流行的Clang編譯器前端,在抽象語法樹生成的過程中運用不同的規則標識各語句結構,同時進行中間結構的改造和校正,得到一個有效的、高正確性的程序結構分析器。程序結構分析器的設計為實現一個有理論基礎的綜合性白盒測試工具奠定了堅實的底層數據支持。

關鍵詞: Clang編譯器; 抽象語法樹; 程序結構分析; 軟件測試

中圖分類號:TP311.1 文獻標志碼:A 文章編號:1006-8228(2016)10-54-03

Design of program structure analyzer based on Clang compiler

Zhou Rui

(Shaanxi institute of technology, Xi'an, Shaanxi 710300, China)

Abstract: At present, the research of software testing in China is still in the basic stage of theoretical methods and management methods, and it has not made any breakthrough in the software testing technology. Based on the front end of current popular Clang compiler, using different rules to identify the structure of statement in the abstract syntax tree generation process, and to carry out the reform and correction of the intermediate structure, an effective program structure analyzer with high accuracy is obtained. The design of program structure analyzer lays a solid underlying data support for realizing a theory based comprehensive white box testing tool.

Key words: Clang compiler; abstract syntax tree; program structure analysis; software testing

0 引言

程序結構分析器的實現離不開一個高效的編譯前端作支持,而編譯技術到目前為止在各領域得到了廣泛的應用。從銀行的管理軟件到高性能計算,大多數都是高級語言進行編寫完成,然后通過靜態或動態編譯最終在計算機上運用。目前比較流行的編譯器是在Apple上使用的LLVM/Clang編譯器、由GNU開發的程序語言編譯器GCC用于Linux系統下編程、IBM公司研制開發的Java編譯器Jikes、Inter公司開發的Open Research Compile,還有常見的MSVC、Borland c、myeclipse和jbuilder等等[3-4]。

程序中的缺陷檢測是編譯器的一項重要任務,也是目前研究的熱點和探討的核心問題。要識別各種錯誤包括:變量未定義、類型檢驗、語義錯誤以及內存泄漏和違規等,就必須在程序分析方面投入更多精力進行設計研究。在保證可靠性和安全性的同時也要減少分析工具的誤報,從而避免給程序員帶來不必要的麻煩,節約時間,提高效率。因此,編譯器技術中靜態或動態的程序分析對識別程序中的錯誤和缺陷有著重要的作用,不過現在面臨的問題還不少,出現了許多新的挑戰[5]。

1 clang的靜態分析器

現有的Clang靜態分析器已經完成了過程內分析(Intra-ProceduralAnalysis)和路徑診斷(Path Diagnostics)兩個大模塊。其中已實現的過程內分析功能包括源代碼級別的控制流圖、流敏感的數據流解析器、路徑敏感數據流分析引擎、死存儲檢查和接口檢查。而路徑診斷信息模塊已經提供路徑診斷客戶端(提供開發新bug報告的抽象接口、獨立于生成過程的可視報告、HTML診斷報告)、缺陷報告器(為前一個模塊服務)[6]。

1.1 靜態分析概述

靜態分析(static analysis)[1]是指在不執行的情況下對代碼進行評估的過程。靜態分析非常強大,這是因為它允許對多種可能性進行快速參考量。一個靜態分析工具能夠探查大量“如果……將會……”的假定情況,而不必為所有這些假定進行計算,進而執行這些代碼。靜態分析技術非常適合于識別安全問題。

⑴ 靜態分析工具徹底而一致地進行檢查,而不管程序員的檢查角度和代碼的復雜程度。

⑵ 通過對代碼本身的檢查,靜態分析工具往往能指出安全問題的根源,而不僅僅是指出某種癥狀。

⑶ 靜態分析能夠在開發早期發現錯誤,甚至,在程序首次運行之前就可以發現。及早發現錯誤,不僅僅減少了修補錯誤所付出的費用,而且這種快速反饋周期有助于程序的完善。

⑷ 當安全研究人員發現一種新攻擊時,靜態分析工具可以很容易地對大量代碼進行重新檢查,從而將了解這種新的攻擊能不能針對這些代碼而成功實施。

對于靜態分析技術,最普遍的不滿意見是:這些工具產生太多的無用信息,尤其是產生太多誤報(程序中實際不存在問題時,卻報告了問題)。但是從安全的角度來看,漏報(程序中存在問題,而安全分析工具卻沒有報告這個問題)問題更為嚴重。誤報的代價是對報告結果的審查浪費時間,但漏報的代價就遠遠不止這些。

1.2 靜態分析路線[7]

靜態分析工具內部的工作流程,包括數據結構、分析技術、規則以及報告結果的方式等,了解這些技術路線對于創建自己的靜態分析工具會有重要幫助。圖1說明了所有針對安全的靜態分析工具的工作方式。

2 生成clang項目

2.1 獲取clang

由于clang只是LLVM前端(front-end)的實例,所以獲取clang時亦需要獲取LLVM。從LLVM官網www.llvm.org上,可以下載到LLVM 3.0與clang 3.0,對應:

llvm-3.0.tar.gz

clang-3.0.tar.gz

2.2 獲取并安裝cmake

隨LLVM源碼發布的,并沒有VS 2010的工程文件,而是需要先使用工具cmake生成其工程文件。從http://www.cmake.org/上,可以下載到cmake 2.8.6安裝文件:cmake-2.8.6-win32-x86.exe。

3 相關技術

3.1 語法樹解析

在..\clangLex\Lexer.cpp文件中對所有預處理后的字符進行標記,并放入緩沖存儲器。一個標記(Token)主要包括:SourceLocation、UintData、Kind、Flags幾個部分,分別表示標記開始和結束的位置、長度、種類以及指示位。這樣為下面的語法分析打下基礎。

在\clangParse\ParseAST.cpp中:

void clang::ParseAST(Sema &S, bool PrintStats) {

… …

while (!P.ParseTopLevelDecl(ADecl)) {

if (ADecl)

Consumer->HandleTopLevelDecl(ADecl.get());

};

… …

} 是生成抽象語法樹和結構分析的代碼關鍵部分

在分析過程中程序的開始處..\tools\clang\tools\

driver\driver.cpp文件中的main函數,設置在項目clang的屬性—配置屬性—調試中的命令參數為-c 文件路徑。但是這個命令跟蹤后不能到達語法分析的真正代碼處,不方便直接進行單步調試,需要進行命令轉換。首先將斷點加在Res=TheDriver.ExecuteCompilation(*C, FailingCommand)語句處開始單步跟蹤,直到\lib\Support\Windows\Program.inc文件中的BOOL rc=CreateProcess(path.c_str(),command,NULL,NULL,TRUE, 0,envblock,NULL, &si, &pi)語句處,參數command中的命令才是真正需要的,形如-cc1 -triple i686-pc-win32 -emit-obj,通過這個命令我們就可以對clang編譯器進行跟蹤調試。

其他主要的調試命令:

-cc1 -ast-dump-xml 文件路徑(語法樹與XML格式輸出)

-cc1 -print-stats 文件路徑(得到語法分析后的匯總信息)

-E 文件路徑(獲得預處理文件)

-S 文件路徑(獲得匯編代碼)

-o 文件路徑(獲得可執行文件)

3.2 預處理器的設計

編譯器提供的預處理器,在預處理完成后,已經使得程序的很多信息丟失了,例如某一個block塊在展開后就無法知道這個塊在源文件中的精確位置信息,這樣不滿足設計的要求,因為在對被測試程序進行分析時,只存儲一些重要結構的統計信息,并不存儲任何源代碼,只存儲一些block塊或者函數的絕對位置信息,當用戶采用視圖查看程序的時候,代碼都是動態加載的。因此需要一個滿足我們要求的預處理器,該預處理器除了能夠按照預處理規則和預定義符號對源碼進行展開外,還需要通過特定的宏來對元素的精確位置進行矯正。

4 總體設計

得到了分析器的需求信息后,需要對分析器系統進行總體的結構設計,主要包括文件、類、函數以及變量的結構分析。

⑴ 文件的結構分析

文件的結構分析主要包括類、函數、全局變量、靜態變量、文件中包含的塊,以及空白行、注釋行等相關信息的統計。

⑵ 類的結構分析

類的結構分析主要包括對基類、友元類、友元函數、注釋和空白行等信息的統計,還有私有變量、共有變量、受保護變量、私有函數、共有函數、受保護函數、構造函數,以及析構函數的名稱和類型的記錄。

⑶ 函數的結構分析

函數的結構分析主要包括函數的調用關系、變量的引用、修改和使用,以及復雜度、注釋行、可見段,函數中所包含的條件和分支的計算與統計。

⑷ 變量的結構分析

變量的結構分析主要包括變量名稱、類型、變量所在文件的路徑和所在類的記錄。

將分析結果呈現在用戶界面上,如圖2所示。

5 總結

本文對程序結構分析器國內外研究現狀進行了較為深入的分析,著重對現有的結構分析器核心技術進行了研究,探討了存在的不足以及需要解決的問題。提出了一個更有效、可靠的基于源碼的程序結構分析器,分別從文件、類、函數、變量四個方面完成了整個結構分析器的設計。為軟件測試理論到實踐的應用打下了一個堅實的基礎。本文的設計也是研發白盒測試工具的核心部分,為了使大規模的程序結構分析更為實用、有效,今后還需要在方法上進行適度的改進和完善。

參考文獻(References):

[1] [美]魯德著,杜大鵬等譯編.編程邏輯與結構化程序設計[M].

水利水電出版社,2004.

[2] 張海藩,牟永敏.面向對象程序設計實用教程[M].清華大學出

版社,2001.

[3] 劉磊.程序分析技術[M].機械工業出版社,2005.

[4] 馬瑞新.基礎c++程序分析與設計[M].大連理工大學出版社,

2007.

[5] 劉宇君,C++程序設計案例分析[M].北京:清華大學出版社,

2011.

[6] 章磊.Clang上的C/C++過程間分析和漏洞發掘[D].中國科

學技術大學,2009.

[7] 楊宇,張健.程序靜態分析技術與工具[J].計算機科學,

2004.2.

主站蜘蛛池模板: 国产丝袜无码精品| 无码人中文字幕| 男人天堂亚洲天堂| 免费无码AV片在线观看中文| 日本不卡在线视频| 久久香蕉国产线看观看精品蕉| 国产日韩精品欧美一区喷| 国产精品 欧美激情 在线播放| 欧美精品一区二区三区中文字幕| 免费三A级毛片视频| 91破解版在线亚洲| 啪啪免费视频一区二区| 欧美日韩北条麻妃一区二区| 亚洲欧美日韩另类在线一| 亚洲第一网站男人都懂| 国产精品一区在线麻豆| 亚洲三级色| 国产精品久久久免费视频| 久久亚洲AⅤ无码精品午夜麻豆| 欧美日韩在线亚洲国产人| 国产精品yjizz视频网一二区| 久久综合婷婷| 无码在线激情片| 波多野结衣无码视频在线观看| 99在线观看国产| 国产91熟女高潮一区二区| 亚洲高清中文字幕在线看不卡| 婷婷99视频精品全部在线观看| 国产无码性爱一区二区三区| 亚洲综合色吧| 一区二区三区四区精品视频 | 精久久久久无码区中文字幕| 六月婷婷精品视频在线观看| 996免费视频国产在线播放| 亚洲区视频在线观看| 伊人久综合| 国产精品久线在线观看| 亚洲乱伦视频| 精品国产女同疯狂摩擦2| 男女精品视频| 国产福利一区视频| 亚洲天堂网2014| 五月天综合婷婷| 国产91精品最新在线播放| 色婷婷亚洲综合五月| 日本成人不卡视频| 精品亚洲欧美中文字幕在线看| 婷婷五月在线| 日本人妻一区二区三区不卡影院| 色综合久久无码网| 国产免费怡红院视频| 亚洲第一视频区| A级毛片无码久久精品免费| 色呦呦手机在线精品| 在线色国产| 九九线精品视频在线观看| 国产人人乐人人爱| 色婷婷在线影院| 亚洲永久免费网站| 999精品在线视频| 久久久精品久久久久三级| 狠狠亚洲婷婷综合色香| 福利姬国产精品一区在线| 亚洲高清在线天堂精品| 中文字幕乱码二三区免费| 成人小视频在线观看免费| 亚洲视频免费播放| 午夜精品久久久久久久99热下载| 4虎影视国产在线观看精品| 国产91九色在线播放| 国产小视频在线高清播放 | 欧美色综合久久| 97影院午夜在线观看视频| 亚洲 欧美 偷自乱 图片| 久久精品国产亚洲AV忘忧草18| 中文字幕 91| 欧美19综合中文字幕| 国产福利2021最新在线观看| 国内精品一区二区在线观看| 免费人欧美成又黄又爽的视频| 免费一级毛片| 欧美成人a∨视频免费观看|