• 沒有找到結果。

Rule 2 設定使用方法以及存取 field 的物件為 criterion

呼叫 Slicing Engine 根據 Criterion 對程式進行 program slicing 產生 slice;

產生出來的 slice 當中每一個敘述句將會得到 weight 的積分值;

}

演算法 3 Rule 2 設定使用方法以及存取 field 的物件為 criterion

z Rule 3 設定呼叫方法中的參數為 criterion,進行 program slicing 分析:

本rule(演算法 4)用來設定敘述句如果物件有使用方法呼叫(method call) 設定其參數為criterion。例如String若使用charAt(index)這方法呼叫時 候 , 若 index 這 參 數 超 出 String 的 長 度 , 便 會 造 成 程 式 產 生 StringIndexOutofBoundsException。所以這種方法主要用來設定參數作為 criterion進行program slicing的分析。

set_arguments_as_criterion(crash_line_statement ,weight){

Criterion = {} ;

對於每個在 crash_line_statement 的 term{

若 term 當中存在 x.y(arguments)這樣的型式;

//x 為一個物件,y 為其物件的呼叫方法,arguments 為傳入此方法的參數。

將 arguments 當中的變數均加入 Criterion;

}

呼叫 Slicing Engine 根據 Criterion 對程式進行 program slicing 產生 slice;

產生出來的 slice 當中每一個敘述句將會得到 weight 的積分值;

}//End Algorithm

演算法 4 Rule 3 設定呼叫方法中的參數為 criterion

z Rule 4 設定陣列索引值為 criterion,進行 program slicing 分析:

本rule(演算法 5)主要在用於一些因為陣列當中的索引值(index)而造成之 錯誤(如ArrayIndexOutOfBoundsException)。用索引值以及當作criterion 進 行 program slicing 的 分 析 。 通 常 這 個 方 法 會 和 rule 5 設 定 陣 列 為 criterion一起使用。

set_array_index_as_criterion(crash_line_statement ,weight){

Criterion={};

對於在每一個在 crash_line_statement 當中的 term{

若 term 符合 array[index][index 2]…這樣的型式;

//代表有索引值存取陣列

取所有 index 當中的變數加入 Criterion }

呼叫 Slicing Engine 根據 Criterion 對程式進行 program slicing 產生 slice;

產生出來的 slice 當中每一個敘述句將會得到 weight 的積分值;

}//End Algorithm

演算法 5 Rule 4 設定陣列索引值為 criterion

z Rule 5 設定陣列為 criterion,進行 program slicing 分析:

本rule(演算法 6)主要在分析由陣列產生的錯誤,如rule 4 陣列索引值為 criterion ; rule 5 是 將 陣 列 本 身 設 為 criterion 。 例 如 ArrayIndexOutOfBoundsException這種錯誤雖然原因有可能出在index設定 錯誤,不過也不能完全忽略掉陣列本身是否設計上有錯誤,所以在此也會設 定陣列本身為criterion。通常這個規則會跟rule 4 設定陣列索引值一起使 用進行分析。

set_array_as_criterion(crash_line_statement ,weight){

Criterion={};

對於在每一個在 crash_line_statement 當中的 term{

若 term 符合 array[index][index 2]…這樣的型式;

//代表有索引值存取陣列 將變數 array 加入 Criterion;

}

呼叫 Slicing Engine 根據 Criterion 對程式進行 program slicing 產生 slice;

產生出來的 slice 當中每一個敘述句將會得到 weight 的積分值;

}//End Algorithm

演算法 6 Rule 5 設定陣列為 criterion

z Rule 6 設定指派(assign)錯誤的變數為 criterion,進行 program slicing 分析:

本rule(演算法 7)主要在遇到錯誤原因在於敘述句指派的錯誤,例如物件型 態上不符合的指派。以Java程式語言當中ArrayStoreException這種錯誤舉 例說明,此錯誤發生原因在於將一個物件指派到一個陣列,但是這個物件的 型態與這個陣列不符合。用程式碼說明:

Object x[] = new String[3];

x[0] = new Integer(0);//發生 ArrayStoreException

我們設定指派的(也就是等號右方的物件)為 criterion 進行分析。通常本規 則會與 rule 7-設定被指派(assign)錯誤的變數為 criterion 所產生出來之 rule engine slice 進行集合運算。

set_assign_term_right_operand_as_criterion(

crash_line_statement ,weight) { Criterion={};

對於每一個在 crash_line_statement 的 right hand side 當中的 term{

取 term 當中的變數加入 Criterion

//如 x=a.y()+b.z+c;則取變數 a、b 以及 c 加入 Criterion。

}

呼叫 Slicing Engine 根據 Criterion 對程式進行 program slicing 產生 slice;

產生出來的 slice 當中每一個敘述句將會得到 weight 的積分值;

}//End Algorithm

演算法 7 Rule 6 設定指派(assign)錯誤的變數為 criterion

z Rule 7 設定被指派(assign)錯誤的變數為 criterion,進行 program slicing 分析:

本rule(演算法 8)跟rule 6 設定指派(assign)錯誤的變數為criterion相 似,均是處理指派錯誤的情況。不同的地方在於本rule是將被指派的變數設 定為criterion,例如ArrayStoreException這種指派錯誤,不能只有分析指 派的變數,也必須對被指派的變數進行分析。用程式碼說明:

Object x[] = new String[3];

x[0] = new Integer(0);//發生 ArrayStoreException

我們設定被指派的(也就是等號左方的物件)為 criterion 進行 program slicing 分析,通常本規則會與 rule 6 一起進行集合運算。

set_assign_term_right_operand_as_criterion(

crash_line_statement ,weight) { Criterion={};

對於每一個在 crash_line_statement 的 left hand side 當中的 term{

取 term 當中的變數加入 Criterion

//如 x=a.y()+b.z+c;則取變數 x 加入 Criterion。

}

呼叫 Slicing Engine 根據 Criterion 對程式進行 program slicing 產生 slice;

產生出來的 slice 當中每一個敘述句將會得到 weight 的積分值 }//End Algorithm

演算法 8 Rule 7 設定被指派(assign)錯誤的變數為 criterion

z Rule 8 設定實做 enumeration 的物件作為 criterion,進行 program slicing 分析:

本rule(演算法 9)主要用在軟體發生NoSuchElementException的情況。主要 造成NoSuchElementException之原因在於當一個實做enumeration的物件在 呼叫nextElement()時候,卻因為已經沒有元素而丟出來之錯誤。這時候設 定此實做enumeration的物件作為criterion進行program slicing的分析。

set_enumeration_as_criterion(crash_line_statement ,weight) { Criterion={};

對於每一個在 crash_line_statement 當中的 term{

若 term 當中符合 x.nextElement()這樣的格式{

//代表 x 為一個實做 enumeration 的物件 將變數 x 加入 Criterion;

} }

呼叫 Slicing Engine 根據 Criterion 對程式進行 program slicing 產生 slice;

產生出來的 slice 當中每一個敘述句將會得到 weight 的積分值 }//End Algorithm

演算法 9 Rule 8 設定 enumeration 作為 criterion

z Rule 9 設定 stack 為 criterion,進行 program slicing 分析:

本rule(演算法 10)用於一個stack型態的物件若產生EmptyStackException 的錯誤時候,設定這個物件為criterion。當一個stack型態的物件內已經沒 有存放任何物件的時候,若在對其進行pop()或是perk()的呼叫,就會造成 EmptyStackException 。 本 rule 則 將 這 個 stack 型 態 的 變 數 設 定 為 criterion,進行program slicing分析,產生slice。

set_stack_as_criterion(crash_line_statement ,weight) { Criterion={};

對於每一個在 crash_line_statement 當中的 term{

若 term 當中符合 x.pop()或是 x.perk()這樣的格式{

//代表 x 為一個 stack 的物件 將變數 x 加入 Criterion;

} }

呼叫 Slicing Engine 根據 Criterion 對程式進行 program slicing 產生 slice;

產生出來的 slice 當中每一個敘述句將會得到 weight 的積分值 }//End Algorithm

演算法 10 Rule 9 設定 stack 為 criterion

z Rule 10 設定控制敘述當中變數為 criterion,進行 program slicing 分析:

本rule(演算法 11)用來對於會影響到產生exception的控制敘述其中的變 數設定為criterion,並且進行program slicing分析。在對於物件做program slicing分析的時候,會影響到這些criterion的控制敘述一般而言都會在其 分析當中。而用此規則對於控制敘述當中的變數再次分析,原因是某些錯誤 其發生原因在於控制流程的設計不當所造成。例如EmptyStackException或 是NoSuchElementException這些錯誤,發生原因多是程式設計師在設計控制 流程時候設定錯誤所造成,在不該執行某些物件的方法時候卻執行。所以這 個規則對於控制criterion的控制敘述其中的變數再次進行分析,通常會跟 之前rule所產生的rule engine slice做集合運算,用以達到一種加分(或減 分的作用)。

set_variable_in_control_predicate_as_criterion(

crash_line_statement ,weight){

Criterion={};

對於每一個控制 crash_line_statement 執行與否的控制敘述當中的 term{

/*如 if statement、do statement、while statement、for statement、switch statement 這 些 控 制 敘 述 如 果 控 制 crash_line_statement 的 執 行 , 代 表 crash_line_statement 的執行與否將會被這些控制敘述當中的變數所影響。

*/

取 term 當中的變數加入 Criterion;

} }

演算法 11 Rule 10 設定控制敘述當中變數為 criterion

z Rule 11 追蹤設定 criterion 的物件傳遞生成敘述,並且標記生成或傳遞物 件設定 criterion 的敘述句:

本rule(演算法 12)是用來找尋物件傳遞的關係,根據此方法會標記slice當 中的敘述句,這些敘述句都代表著跟slice當中的criterion有直接傳遞的關 係。也代表著criterion物件是否存在與其值的設定,是由這些被標記的敘 述句直接影響。

被標記之敘述由於跟 criterion 有直接傳遞之關係,所以在積分上會有所加 分,代表此敘述對 criterion 有直接的關聯。而由其他物件設定 criterion 的方式基本上有三種:

1. 由其他物件直接設定,例如: criterion= someObject;。

2. 由其他物件的呼叫方法回傳給 criterion 的,例如:

criterion=someObject.MethodCall();或是 criterion=StaticMethodCall();。

3. 由其他物件的 field 所設定的,例如 : criterion=someObject.field;。

如果是第一種情況,將所此設定 criterion 的物件(如 someObject)設定成新 的 criterion 傳入 Mark_Obj_Trace 方法遞迴呼叫即可。

若是第二種情況,則將此此設定 criterion 的物件的呼叫方法的回傳值當作 的 criterion 傳入 Mark_Obj_Trace 並且遞迴下去。第三種情況與第二種情 況類似,將此設定 criterion 的物件的 Field 值作為新的 criterion 傳入 Mark_Obj_Trace 方法遞迴。

其中如果遞迴函式當中的 criterion 物件不是由其他物件所傳遞過去的,代 表在這行敘述當中所傳入的 criterion 在此被生成,所以還會再給予加分。

本演算法主要利用遞迴方式運作,初始情況將 rule engine slice 當中紀錄 的 criterion 傳入遞迴函式,尋找設定 criterion 的敘述句。並且將設定 criterion 的物件當作下一個要遞迴呼叫的物件,繼續遞迴呼叫直到已經對 rule engine slice 的每一行指令分析過了。除了主要代表這些敘述對 criterion 有直接性的影響外,後續做分析的時候也可以提供其他規則使用。

trace_criterion(rule engine slice RES ,weight){

對紀錄在 RES當中的每一個 criterion{

Mark_Obj_Trace(criterion ,RES,weight);

}

回傳修改過後的RES。 }//End algorithm

//遞迴函式 Mark_Obj_Trace() void Mark_Obj_Trace(

criterion transparent_obj ,rule engine slice RES , weight){

/* transparent_obj代表的意義是跟 criterion 有直接設定關係的物件。*/

對於在RES當中的每一行在transparent_obj之前的敘述句stmt{

//根據transparent_obj當中的 line number 來判斷哪些敘述句在它之前。

當transparent_obj在一個敘述句m_stmt當中被其他物件指派 (transparent_obj在等號左方作為 left operand){

在RES標記m_stmt。

每一個m_stmt將會得到 weight 的積分值。

如果等號右方-right hand side 為一個變數v 。{

Mark_Obj_Trace(v ,res , weight)。

//將 v 設為 criterion 並傳入 Mark_Obj_Trac 方法遞迴呼叫。

//代表 criterion= someObject;這樣的型式。

}

如果等號右方-right hand side 為一個物件執行方法呼叫,

或是靜態的方法呼叫。{

將這個方法呼叫的回傳物件v傳入 Mark_Obj_Trace 遞迴呼叫。

Mark_Obj_Trace(v ,res , weight)。

//代表 criterion= someObject.MethodCall();

//而這個方法的回傳值直接設定 criterion。

}

若等號右方-right hand side 為一個物件的 field 值。{

將此物件的這個 field f傳入 Mark_Obj_Trace 遞迴呼叫。

Mark_Obj_Trace(f ,res , weight)。

//代表 criterion=somObject.SomeField;

}

}//end method

演算法 12 Rule 11 追蹤 criterion 的物件傳遞關係 z Rule 12 找尋可能造成錯誤的控制敘述:

本rule(演算法 13)用於找尋可能會造成錯誤的控制敘述。假設在rule engine slice 當中被標記的敘述句(例如使用rule 11 追蹤criterion的物件 傳遞關係而被標記的敘述句)代表著應該要被執行到的指令,而這些指令被 一些判斷敘述句給控制住導致其可能無法執行到,在此我們評估這種情況是 一種錯誤。

find_error_predicate(weight , rule engine slice

RES

){

對每一個在

RES

當中的控制敘述

(如 if、while(do while)、for、switch 等敘述句)。 { 如果這些敘述句控制了被標記得敘述句{

//代表這些被標記的敘述句被這些控制敘述所包圍。

將這些敘述句加上 weight 的積分值。

} }

}//End Algorithm

演算法 13 Rule 12 評估錯誤的控制敘述 z Rule 13 標記轉換物件型態的敘述句:

本rule(演算法 14)用於標記轉換物件型態的敘述句。本rule通常會使用 rule 11 (追蹤物件傳遞關係)此rule產生的rule engine slice所標記的敘

本rule(演算法 14)用於標記轉換物件型態的敘述句。本rule通常會使用 rule 11 (追蹤物件傳遞關係)此rule產生的rule engine slice所標記的敘

相關文件