呼叫 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所標記的敘