Ứng dụng phân tích luồng dữ liệu liên thủ tục

Một phần của tài liệu NGHIÊN cứu kỹ THUẬT PHÂN TÍCH CHƯƠNG TRÌNH TĨNH TRONG VIỆC NÂNG CAO CHẤT LƯỢNG PHẦN mềm (Trang 55 - 58)

Phân tích chương trình tĩnh

2.2.3.Ứng dụng phân tích luồng dữ liệu liên thủ tục

Một ứng dụng cho phân tích liên thủ tục được gọi là rung cây (tree shaking), đây là ứng dụng để xác định và loại bỏ những hàm không bao giờ được gọi hay hàm chết và từ đó có thể loại bỏ nó từ chương trình mà vẫn đảm bảo tính an toàn. Điều này thực sự hữu ích nếu chương trình thực hiện với thư viện hàm lớn.

v biểu thị tập các hàm có thể được gọi đến trong tương lai. một biến hạn chế J K

Tiếp theo, sử dụng ký hiệu entry(id) cho các nút vào (entry) của hàm id. Khi đó, các ràng buộc:

• Cho các phép gán, điều kiện và output là: vK = ∪ wK ∪ f uncs(E) ∪ ∪ Jentry( f )K J wsucc(v) f f uncs(E) • Và cho các trường hợp khác là: v = ∪ J Kw J K wsucc(v)

Trong đó, hàm funcs được định nghĩa như sau:

funcs(id) = f uncs(const) = f uncs(in put) = ∅

funcs(E1o pE2) = f uncs(E1) ∪ f uncs(E2)

funcs(id(E1, ..., E2)) = {id} ∪ f uncs(E1) ∪... ∪ f uncs(En)

Trong phân tích này, vế phải trong các ràng buộc là các hàm đơn điệu. Khi đó, với cách xây dựng CFG cho cả chương trình như trên và các ràng buộc cho ứng dụng như trên ta sẽ có hệ phương trình ràng buộc và việc giải nghiệm cố định nhỏ nhất (Mục 1.4.3) để tìm ra các hàm tất cả các hàm không được sử dụng trong chương trình. Như vậy, ta có thể loại bỏ các hàm này mà vẫn đảm bảo sự an toàn cho chương trình. Mặt khác, với cách xây dựng CFG như trong Mục 2.2.1 ta hoàn toàn có thể áp dụng thuật toán tìm điểm cố định để tìm nghiệm nhỏ nhất cho các phương trình ràng buộc trên. Ứng dụng phân tích tĩnh liên thủ tục ví dụ trong Mục

2.2.1 ta được chương trình tối ưu hóa như sau: int f(int a,b){

return a+b; } main() { int input,x,y; scanf("%d", &input); x=input; y=func(x,2013); return y; } J

Chương 3

Một phần của tài liệu NGHIÊN cứu kỹ THUẬT PHÂN TÍCH CHƯƠNG TRÌNH TĨNH TRONG VIỆC NÂNG CAO CHẤT LƯỢNG PHẦN mềm (Trang 55 - 58)