• 沒有找到結果。

4.1. 函式呼叫內容

1 62%

2 17%

3 12%

4 1%

5 4%

6 0%

7 4%

圖 16 函式呼叫長度

在 4089 次的函式呼叫中,62%的函式內部僅含有一次函式呼叫,這些函式在

intra-procedure 的方法中無法產生 pattern,因此在之後的分析中我們將去不考慮此情形。

另外,僅有4%的函式呼叫其長度是在七次或七次以上,而長度大於64僅有5次。

4.2.

SUPPORT 與 RULE 數量

0 100 200 300 400 500 600 700 800 900

0 0.1 0.2 0.3 0.4

圖 17 SUPPORT 與 RULE 數量

圖中橫座標為 threshold 值,縱座標為在各以 threshold 值為底限所產出的 rule 數量,

其中各點為獨立之實驗。

在資料探勘中 support 值決定 rule 產生之數量,在這份研究中在 support 值設為 0.03 時(即至少出現 1576*0.03=47 次),rule 約產生 850 則,而 0.04 時則降至 100 則,至 0.33 時則無 rule 產生。高的 support 雖然較準確,但會造成可能忽略次數低於閥值(threshold) 的 rule,即 false-negative 之情形,而相反地,低 support 雖較能找出 rule,卻可能造成 false-positive 之情形。

4.3.

RULE 長度

這裡將 rule 長度定義為 rule 中所包含的集合數量,而一個集合包含一函式及零個以 上的變數。舉例來說,{channel_prepare_select}Æ{packet_have_data_to_write}Æ{select}

為所找出的 rule,代表三個程式實體接連被呼叫或使用,則此 rule 長度為3。

0 50 100 150 200 250

1 2 3 4 5 6 7 8 9

圖 18 rule 長度統計

圖中橫座標為 rule 長度,縱座標是該 rule 長度的 pattern 之數量,threshold 為至少 出現 47 次。

此圖中說明我們的設計中,所找出的 rule 最長可為八,而有 90%以上的 rule 其長度 介於二到五之間,而長度為一的 rule 雖無法用於撰寫建議,但可以做為錯誤偵測之後,

其使用方法見下節。

4.4.

RULE 說明 No Support

i 101 c->input ii 95 c->output iii 103 c->extended

iv 50 c->input Î c->output

v 50 c->input Î c->output Î c->extended vi 100 c->input Î c->extended

vii 53 c->output Î c->extended

上表比較 c->input、c->output 以及 c->extend 三個變數之關係,最左欄 表示此 rule 之出現次數,舉第 v 項 rule 說明,其表示程式執行中曾發生過

c->input、c->output 以及 c->extend 曾在某一函式中有次序地被使用。

若比較 iv 項第與第 v 項 rule,則可得出一結論:

若已知 c->input、c->output 兩變數接連使用,則 c->extended 隨後也將被使用。

使用貝氏機率表示其可能性 Prob(support(v)|support(iv))=100%,即 confidence 為100%,表示其 pattern 為可靠的。

故當程式中已使用 c->input 及 c->output 時,若 c->extended 不被使用則可判定 為程式錯誤

另外,若比較第 i 項及第 vi 項,則可得以下之結論:

若已知 c->input 變數被使用,則 c->extended 隨後也將被使用。

其 confidence 為99%,表示其 pattern 可能為可靠的。

程式中只有一處不符此 pattern 之情形,此處可判定為錯誤 比較(iii, vi)以及(v, vii)可樣可得此種結果

另外,若比較第 i 項及第 iii 項,則可得以下之結論:

若已知 c->input 變數被使用,則 c->out 隨後也將被使用。

其 confidence 為50%,表示其 pattern 為不可靠的。

程式中有多處地方不合此 pattern,此處可判定此 pattern 為錯誤

由上述之三種情況可將得出的 rule 分為 frequent、Potential-Error 及 Unlikely 三種,

決定標準在於 confidence。以上討論的三個變數在版本歷程中不曾出現一行變動(one-line checkins)的情形,下一頁的示例討論加入一行變動之情形。

No Support

a 58 s = strlen(str) a.1 18 1

b 66 strlcpy (str, len, m) b.1 4 1 74 c 60 m = xmalloc(len) c.1 22 74

d 58 s = strlen(str) Î strlcpy (str, len, m) e 58 s = strlen(str) Î m = xmalloc(len)

f 58 m = xmalloc(len) Î strlcpy (str, len, m)

g 58 s = strlen(str) Î m = xmalloc(len) Î strlcpy (str, len, m) g.1 18 22 4

上表比較 strlen、strlcpy 及 xmalloc 三函式及其相關變數之關係,其中 row a.1 對映至 row a 之項,該數字表示對映的辯識符(identifier)曾在一行變動(one-line check-ins)中被更動 的次數。由於變數名稱較函式名稱變動容易,因此統計變數的變動次數可能較無意義。

變動次數用於文件製作的方式有以下二種:

z 當使用者查詢某一函式的用法時,結果出現多種 pattern,則 pattern 可按照以下 二參數排序:confidence 以及函式變異程度平均值,假設 rule g 為其中之一,則 其函式變異程度平均值為(18+22+4)/3=15

z 描述 pattern 時可以用變動次數標示(highlight)重要的部份,如 rule g 中可特別標示 xmalloc,以表示這部份最常出錯,防止使用者在撰寫新功能時錯誤或是在除錯(debug) 時可特別注意此處。

4.5. 例外情況

在 Socket programming 中,通常一個 client 程式其建立 tcp socket connection 的動作 只會出現一次,因此在 sequential pattern 分析的初始即會因發生次數(support)不足而被捨 棄。

另外在 openssh 中大量使用記憶體相關的函式,因此造成分析時母體數過高,造成 其它發生次較低的 pattern 被忽略。

相關文件