3 Thực nghiệm, đánh giá
2.2 CFG của phương thức execute
Trước khi đưa ra thuật tốn chuyển đổi CFG thành CG, chúng tơi hình thức hóa CG bằng cách mở rộng định nghĩa đồ thị luồng trong Định nghĩa 1 như trong Định nghĩa 4.
Định nghĩa 4 (CG). Cho I là tập các tên phương thức, G là một đồ thị của CFG. Đồ thị
G0= (V0, E0, s0, t0, µ0, ν0, M C0) là một đồ thị giản lược của Gnếu:
• s0 =s∧t0 =t;
• V0 ={vi ∈V ∧M C(vi)∈I} là tập đỉnh;
• E0={(vi, vj)|vi ∈V0∧vj ∈V0} là tập cạnh, thỏa:
– (vi, vj)∈E, hoặc
– (vi, vj)∈/ E∧(vi, vi+1)∈E∧(vi+1, vi+2)∈E, ...,(vj−1, vj)∈E, and vk∈/ V0, k= (i+ 1) . . (j−1)
2.3.2 Thuật toán giản lược CFG
Từ định nghĩa đồ thị giản lược nêu Định nghĩa 4, chúng tơi xây dựng thuật tốn cho phép thu được đồ thị giản lược của một đồ thị CFG, gọi là đồ thị lời gọi phương thức CG (Call Graph) trong đó chỉ chứa các đỉnh là các lệnh gọi phương thức. Thuật tốn được trình bày trong Algorithm 3.
Vì kích thước của tập Rđược tính ở dịng 11 của Algorith 3 là nhỏ nên độ phức tạp thời gian của thuật tốn có thể ước lượng làO(n).
Algorithm 3 Giản lược CFG thành đồ thị CG ReduceGraph(G, G0):
1: InitializeV0=∅,E0=∅
2: foreach vi∈V do {Tìm tất cả lời gọi phương thức} 3: if vi ∈V ∧M C(vi)6=null then 4: V0←vi 5: end if 6: end for 7: foreach vi0 ∈V0 do 8: if (s, vi0)∈E then 9: E0 ←(s0, vi0) 10: end if
11: Tìm tập đỉnh V0 đi từvi0 khơng qua đỉnh trung gian v∈V0, gọi là R 12: foreach r ∈R do
13: E0 ←(vi0, r)
14: end for
15: end for
2.3.3 Ví dụ giản lược CFG
Áp dụng thuật toán Algorith 3, ta thu được đồ thị giản lược của đồ thị CFG cho phương thứcexecute() như cho trong Hình 2.3.
4 DB.open() 70 DB.update() DB.open() 49 DB.close() DB.connect() 61 79 40 DB.close()