• 沒有找到結果。

3. 系統架構與設計

3.4. 錯誤警示

本階段之工作目標是取得在版本資料庫中特定型態之差異(diff),在此我們將該型態 鎖定為只有一行之變動,之後再將此統計資料加入圖 9 系統架構圖之 stage II 所得 pattern。在實作上可分為兩部份,一是處理版本資料庫並從中萃取資訊,二則是將此資 訊連結至上一節之結果。

3.4.1. 整理版本資料庫

在 cvs 儲存方法是以檔案做為版本之單位,意即在原始的設計上僅有檔案的版本號 是可直接取得,其它如檔案內容-如函式或結構(structure)定義-須進一步分析才能界定 是否在該檔案版本號下有所變動。各檔案內除了完整儲存最新一版之外,其它版本皆以 差異(diff)的方式儲存,其檔案內容架構如下:

表 6 CVS 儲存格式說明

A. 此檔案的相關資訊-如版本之繼承或分支關係、版本之修改者與日期等 B. 基底版本(baseline revision)-即所紀錄之唯一完整版本,除明確表示其版

本號外,其中又包含兩個 section

i. Log-在 cvs 的變動行為中,變動的發起者(submitter)可以文字敍 述記錄相關資訊;

ii. Text-完整的程式本文

C. 差異版本-記錄與下一版之間之差異,同樣地分為兩部份 i. Log-同上項

ii. Text-以 diff 之方式儲存與下一版之間的差異。

在此一部份我們只需要上述之 C.ii 部份,使用 python 直接處理檔案內容,這些檔案 包括版本資料庫中所有具有原始碼(source code)之檔案,使用適當的分節技巧後,略過不 相關的 A、B、C.i.部份,將所有之差異寫入一個暫存檔中,作法如圖 14。

但是 diff 之內容可能已失去其完整性而難無法使用 CIL 等工具分析,以表 7 為例說 明,表中為同一個檔案的二個版本,其中 Version 2 增加或修改部份內容,改變處有三,

其一是註解增加一行,而我們也不需此一部份,但當 CIL 等程式分析工具處理包含此註 解的全部差異時,由於此部份是以自然語言(natural language)表達,顯然會造成程式分 析工具錯誤;其二是增加一函式呼叫 another(flag),其為完整之 statement,可直接由程 式分析工具處理,但是考慮到例中第三種情況時,由於 C 語言容許一個 statement 在多 行完成,而 cvs 是以一行為單位做 diff,則此情況會造成衝突,此例中 buk 此函式呼叫 更動一參數,而該參數又恰巧位於下一行中,只使用 diff 之結果無法回建 AST,導致 CIL 無法使用。

故若在處理 DIFF 時使用較為正規的方法(如 CIL)會導致研究難以進行,因此選 擇針對 openssh 之情況,研究者以程式自動化地判斷各 diff 是否為所需資料,詳細內容

及演算法如圖 15 圖 15 所示。

圖 14 diff 處理示意 表 7 版本差異示例

Version 1 Version 2 Diff(version1, version2) int foo(void)

{ /*

Comment line 1

*/

int foo(void) {

/*

Comment line 1 Comment line 2

*/

BASELINE VERSION Version 1.5 Log … Text … VERSION DIFF Version 1.4

BASELINE VERSION Version 1.8 Log … Text … VERSION DIFF Version 1.7

cleansing tokenize

虛擬碼 說明 foreach file in repository

skip to diff section;

直接讀出版本庫中每個檔案的 diff section(表 6 之 C.ii 部份)

Foreach diff

Foreach line in the diff

對各 diff 中的每一行

if (this line is comment) or 該行是註解,除了正常的註解方式,

如//或/* */,openssh 關於註解的特別 處是其在多行註解中(如表 7 中之 Comment line 2)雖無//或/* */,

通常以星號*做為該行起始,在排除掉

if this diff contains exactly only one line tokenize this line 3.4.2. 對映至 MINED PATTERN

將上一小節之結果-即各 token 之數量-對映到各 stage II 所得之 pattern 中,toekn 可能為 pattern 內之函式或變數,我們會在第四章中討論 pattern 內各 token 之關係以及 pattern 間如何利用 token 衡量其重要性。

相關文件