Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 72 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
72
Dung lượng
436,05 KB
Nội dung
ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ TRẦN MẠNH ĐƠNG 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 LUẬN VĂN THẠC SĨ CÔNG NGHỆ THÔNG TIN Hà Nội – 2013 ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ TRẦN MẠNH ĐÔNG 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 Ngành: Công nghệ thông tin Chuyên ngành: Công nghệ phần mềm Mã số: 60 48 10 LUẬN VĂN THẠC SĨ CÔNG NGHỆ THÔNG TIN NGƯỜI HƯỚNG DẪN KHOA HỌC: TS Nguyễn Trường Thắng Hà Nội – 2013 Ph Mục lục LỜI CÁM ƠN LỜI CAM ĐOAN MỤC LỤC DANH MỤC CÁC KÝ HIỆU VÀ CHỮ VIẾT TẮT DANH MỤC CÁC HÌNH VẼ MỞ ĐẦU Giới thiệu 1.1 Giới thiệu phân tích chương trình 1.2 Điểm mạnh điểm yếu 1.3 Các cơng nghệ phân tích chương trình 1.4 Nền tảng 1.4.1 1.4.2 1.4.3 Phân tích chương trình tĩnh 2.1 Phân tích luồng liệu nội thủ tục 2.1.1 2.1.2 2.2 Phân tích luồng liệu liên thủ tục 2.2.1 2.2.2 2.2.3 Thực nghiệm 3.1 Tổng quan SOOT 3.1.1 Giới thiệu 3.2 Phân tích chương trình với SOOT Eclipse KẾT LUẬN TÀI LIỆU THAM KHẢO PHỤ LỤC A PHỤ LỤC B PHỤ LỤC C PHỤ LỤC D DANH MỤC CÁC KÝ HIỆU VÀ CHỮ VIẾT TẮT Danh sách hình vẽ 1.1 CFG cho lệnh 1.2 CFG cho lệnh 1.3 CFG cho lệnh if, if-else 1.4 CFG cho lệnh while, for 1.5 CFG chương trình tính giai thừa 1.6 Biểu đồ Hasse biểu diễn Dàn 1.7 Các biểu đồ Hasse Dàn 1.8 1.9 Các biểu đồ Hasse Dàn Phép toán cộng dàn 1.10 Phép toán nâng (lift) dàn 1.11 Phép toán lift tập tạo thành dàn 2.1 Dàn cho chương trình phân tích tính sống biến 2.2 Dàn cho chương trình phân tích biểu thức bận rộn 2.3 CFG chương trình phân tích biểu thức bận rộn 2.4 Dàn cho chương trình phân tích biểu thức có sẵn 2.5 CFG chương trình phân tích biểu thức có sẵn 2.6 CFG chương trình phân tích định nghĩa tới 2.7 Đồ thị def-use định nghĩa tới biến chư 2.8 Ví dụ CFG tổng qt cho chương trình có chứa lời gọi 2.9 CFG chương trình phân tích liên thủ tục 2.10 CFG đơn biến 2.11 CFG đa biến 3.1 Tổng quan luồng làm việc SOOT [10] 3.2 Phương thức copy() merge() SOOT 3.3 Kết phân tích với SOOT MỞ ĐẦU Sự tiến hóa nhanh chóng thiết bị phần cứng 30 năm qua đưa đến hệ phát triển theo cấp số nhân kích cỡ chương trình phần mềm chạy Quy mơ ứng dụng cực lớn (khoảng từ tới 40 triệu dòng mã lệnh) tiếp tục gia tăng thời gian tới Những phần mềm cần phải thiết kế với chi phí vừa phải phải bảo trì, nâng cấp tồn vịng đời chúng, tầm 20 năm Một thực tế quy mơ hiệu nhóm lập trình bảo trì chúng khơng thể tăng theo tỉ lệ Với hồn cảnh đó, tỉ lệ giả định lỗi 1000 dòng lệnh phần mềm lạc quan đạt hệ thống đòi hỏi độ an tồn cực cao Do đó, vấn đề độ tin cậy phần mềm (software reliability) chắn mối quan tâm thách thức xã hội đại ngày phụ thuộc vào dịch vụ máy tính đem lại Nhiều kỹ thuật kiểm chứng phần mềm (software verification) công cụ hỗ trợ kèm phát triển để thực thi giả lập chương trình nhiều mơi trường khác Tuy nhiên, gỡ rối mã dịch giả lập mô hình mã nguồn chương trình khơng thể mở rộng quy mô thường xét mức độ bao phủ hạn chế hành vi động chương trình Các phương pháp hình thức kiểm chứng chương trình (formal methods) cố gắng chứng minh cách tự động chương trình thực thi đắn môi trường đặc tả Mảng nghiên cứu bao gồm phương pháp suy dẫn (deductive methods), kiểm chứng mơ hình (model checking), định kiểu chương trình (program typing) phân tích chương trình tĩnh (static program analysis) Ba nhóm đầu tập trung vào việc kiểm chứng phần mềm mức mơ hình, nhóm cuối xử lý phần mềm mức mã nguồn Phân tích chương trình tĩnh thu hút quan tâm tảng lý thuyết hình thức mục đích ứng dụng thực tế Kỹ thuật phát tính chất/hành vi chương trình mà khơng u cầu chạy chương trình Ngồi ra, số lỗi chương trình việc khởi tạo/sử dụng biến chương trình, biến trỏ NULL, phát kỹ thuật Mục tiêu luận văn cập nhật xu giới lĩnh vực phân tích chương trình cải tiến kỹ thuật Cụ thể, luận văn tập trung vào nghiên cứu kỹ thuật phân tích chương trình dựa đồ thị luồng liệu để nâng cao chất lượng phần mềm Tiến hành thực nghiệm công cụ SOOT, cơng cụ mã nguồn mở phân tích chương trình viết Java mơi trường tích hợp phát triển Eclipse Cấu trúc luận văn bao gồm: Chương giới thiệu tổng quan phân tích chương trình tĩnh Trong chương này, trình bày định nghĩa kỹ thuật phân tích chương trình tĩnh, ứng dụng kỹ thuật phân tích, điểm mạnh hạn chế kỹ thuật phân tích tĩnh Và phần Chương phần kiến thức tảng sử dụng kỹ thuật phân tích chương trình tĩnh Tiếp theo Chương trình bày phân tích luồng liệu Cụ thể, trình bày phương pháp phân tích luồng liệu hàm khơng có chứa lời gọi hàm (nội thủ tục) phân tích luồng liệu đồ thị luồng liệu cho chương trình với lời gọi hàm (liên thủ tục) Chương trình bày phần thực nghiệm với SOOT - công cụ nguồn mở để phân tích chương trình viết Java mơi trường tích hợp phát triển Eclipse Cuối phần kết luận tài liệu tham khảo Chương Giới thiệu 1.1 Giới thiệu phân tích chương trình Phân tích chương trình tĩnh kỹ thuật xác định tính chất/hành vi chương trình mà khơng cần phải chạy chương trình Phân tích tĩnh xây dựng dựa lý thuyết diễn giải trừu tượng (abstract interpretation) [5, 6] để chứng minh tính xác phân tích liên quan đến ngữ nghĩa ngơn ngữ lập trình Có nhiều câu hỏi thú vị mà hỏi chương trình điểm (point) riêng lẻ chương trình như: • Chương trình có dừng hay khơng? • Độ lớn vùng nhớ (heap) chạy? • Đầu (output) gì? • Biến x có ln ln giá trị khơng? • Giá trị x đọc tương lai? • Con trỏ p null? • Biến x khởi tạo trước đọc khơng? • v.v Theo lý thuyết Rice [14], tất câu hỏi hành vi chương trình khơng thể định/chứng minh (undecidable) Thay mức mơ nhiều phương pháp hình thức, luận văn hướng tới việc phân tích chương trình tĩnh Cụ thể, luận văn trình bày kỹ thuật để cải 10 tiến mã chương trình phát lỗi tiềm việc phân tích chương trình tĩnh dựa phân tích luồng liệu 1.2 Điểm mạnh điểm yếu Phân tích chương trình tĩnh có ưu điểm sau: • Chỉ lỗi vị trí xác chương trình • Dễ dàng thực chuyên gia kiểm định chất lượng phần mềm hiểu rõ mã nguồn • Khoảng thời gian ngắn từ lúc phát tới sửa lỗi • Có thể tự động hóa nhanh (thơng qua cơng cụ hỗ trợ ví dụ: SOOT, Astree, TVLA, ) • Lỗi phát sớm qui trình phát triển phần mềm phí sửa lỗi thấp Tuy nhiên, điểm yếu kỹ thuật xuất câu lệnh xuất tham chiếu, ràng buộc nằm phạm vi suy luận biểu trưng chương trình Hạn chế chất việc phân tích tĩnh - khơng chạy với liệu cụ thể Một số điểm yếu không khắc phục được: • Mất thời gian phải thực tay • Việc tự động hóa hướng vào ngơn ngữ lập trình (ví dụ: SOOT kiểm tra mã nguồn chương trình viết ngơn ngữ Java) • Thiếu nhân lực hiểu phân tích chương trình • Có thể sinh nhiều lời cảnh báo lỗi khơng xác • Khơng phát lỗi xuất chạy chương trình (run-time error) 1.3 Các cơng nghệ phân tích chương trình tĩnh Những kỹ thuật phân tích chương trình tĩnh thu hút nhiều nghiên cứu giới, có nhiều kỹ thuật tựu chung phân theo nhóm sau: 52 KẾT LUẬN Phân tích chương trình tĩnh kỹ thuật thu hút quan tâm giới ứng dụng mang lại Trong q trình thực luận văn này, tơi tìm hiểu kiến thức tảng phân tích chương trình - khâu vô quan trọng giúp phát lỗi tối ưu hóa chương trình để nhằm nâng cao chất lượng phần mềm Cụ thể, luận văn đạt trình bày tổng quan phân tích chương trình tĩnh Trong đó, nêu khái niệm liên quan đến phân tích chương trình tĩnh, điểm mạnh mặt yếu, kỹ thuật phân tích chương trình tĩnh giới học thuật nghiên cứu Tiếp theo lý thuyết tảng liên quan đến phân tích chương trình tĩnh cách xây dựng đồ thị luồng liệu, lý thuyết toán học lý thuyết Dàn, thuật tốn tìm điểm cố định Từ kiến thức tảng đó, luận văn tiếp cận nghiên cứu kỹ thuật phân tích chương trình tĩnh mức mã nguồn, phân tích dựa phân tích luồng liệu Từ kết thu từ kỹ thuật phân tích giúp cho việc phân tích thuộc tính/hành vi xảy chương trình Cuối cùng, luận văn tiến hành thực nghiệm kỹ thuật phân tích tĩnh cơng cụ mã nguồn mở SOOT, sử dụng phân tích cho ngơn ngữ lập trình Java Tuy nhiên, việc phân tích tĩnh khó việc phân tích tĩnh dựa phân tích luồng liệu kỹ thuật đề cập khuôn khổ luận văn tốt nghiệp Trong tương lai, số vấn đề cần tiếp tục nghiên cứu phân tích khoảng, phân tích luồng điều khiển (phân tích trỏ) phát triển cơng cụ phân tích chương trình tĩnh cho ngơn ngữ khác C, C++, Java, nhằm tối ưu hóa chương trình dịch, giảm chi phí nâng cao chất lượng phần mềm 53 Tài liệu tham khảo [1] Anand S., Godefroid P., and Tillmann N (2008), Demand-Driven Composi-tional Symbolic Execution, In Proceedings of TACAS, (367-381) [2] Ayewah N., Hovemeyer D., Morgenthaler J.D., Penix J., Pugh W (2008), Using static analysis to find bugs, IEEE Software 25, (22-29) [3] Chess B., West J (2007), Secure Programming with Static Analysis, Addison- Wesley [4] Clarke E.M., Grumberg O., Peled D.A (1999), Model Checking The MIT Press [5] Cousot P (2001), Abstract interpretation based formal methods and future challenges, Lecture Notes in Computer Science 2000, (138–170) [6] Cousot P., Cousot R (1997), Abstract interpretation: a unied lattice model for static analysis of programs by construction or approximation of xpoints, In Conference Record of the Sixth Annual ACM SIGPLANSIGACT Symposium on Principles of Programming Languages, (238–252), Los Angeles, California, 1977 ACM Press, New York [7] Duffy D.A (1991), Principles of Automated Theorem Proving, JohnWiley Sons [8] Gallier J.H (1986), Logic for Computer Science: Foundations of Automatic Theorem Proving, Harper Row Publishers [9] Huth M., Ryan M (2004), Logic in Computer Science: Modeling and Reasoning About Systems, Cambridge University Press [10] Lam P., Bodden E., Lhoták O., Hendren L (2011), The Soot framework for Java program analysis: a retrospective, Cetus Users and Compiler Infrastructure Workshop 54 [11] Nielson F., Nielson H.R., Hankin C (2004), Principles of Program Analysis, Springer [12] Palsberg J., Schwartzbach M.I (1992), Polyvariant Analysis of the Untyped Lambda Calculus, BRICS, Dept of Computer Science - University of Aarhus [13] Pierce B.C (2002), Types and Programming Languages, MIT Press [14] Rice H.G (1953), Classes of recursively enumerable sets and their decision problems, Transactions of American Math Society 74, (358-366) [15] Schwartzbach M.I (2008), Lecture notes on static analysis Technical report, BRICS, Dept of Computer Science - University of Aarhus [16] Tarski A (1955), A lattice-theoretical fixpoint theorem and its applications, Pacific Journal of Math 5:2, (285-309) [17] Thang N.T., Long N.D., Yoshida K., Nakamura T., Katayama T (2007), An open architecture for static code-analyzing tools In: Proceedings of JapanVietnam Workshop on Software Engineering [18] Wogerer W.(2005), A Survey of Static Program Analysis Techniques, Technische Universitat Wien [19] http://www.sable.mcgill.ca/soot/ 55 PHỤ LỤC A: TÌM ĐIỂM CỐ ĐỊNH NHỎ NHẤT CHO CHƯƠNG TRÌNH VÍ DỤ VỀ TÍNH SỐNG CỦA BIẾN Phương trình: x1 → JentryK = Jint fK x2 → Jint fK = Jint uu_fK \ {f} x3 → Jint uu_fK = Jf = 1K \ {uu_f} x4 → Jf = 1K = Juu_f = 0K \ {f} x5 → Juu_f = 0K = Jn > 0K \ {uu_f} x6 → Jn > 0K = (Jreturn fK ∪ Jf = f*nK) ∪ {n} x7 → Jreturn fK = JexitK ∪ {f} x8 → Jf = f*nK = (Jn = n-1K \ {f}) ∪ {n,f} x9 → Jn = n-1K = (Jn > 0K \ {n}) ∪ {n} x10 → JexitK = ∅ Chuyển hàm: x1 = F1(x2) = x2 x2 = F2(x3) = x3 \ {f} x3 = F3(x4) = x4 \ {uu_f} x4 = F4(x5) = x5 \ {f} x5 = F5(x6) = x6 \ {uu_f} x6 = F6(x7; x8) = (x7 ∪ x8) ∪ {n} x7 = F7(x10) = x10 ∪ {f} x8 = F8(x9) = (x9 \ {f}) ∪ {n,f} x9 = F9(x6) = (x6 \ {n}) ∪ {n} x10 = F10() = ∅ Thuật tốn lặp chaotic tìm điểm cố định nhỏ nhất: x1 = x2 = x3 = x4 = x5 = x6 = x7 = x8 = x9 = x10 = ⊥ = ∅ Lặp 1: x1 = ∅ x2 = ∅ x3 = ∅ 56 x4 = ∅ x5 = ∅ x6 = {n,f} x7 = {f} x8 = {n,f} x9 = {n,f} x10 = ∅ Lặp 2: x1 = ∅ x2 = ∅ x3 = ∅ x4 = {n} x5 = {n,f} x6 = {n,f} x7 = {f} x8 = {n,f} x9 = {n,f} x10 = ∅ Lặp 3: x1 = ∅ x2 = ∅ x3 = ∅ x4 = {n} x5 = {n,f} x6 = {n,f} x7 = {f} x8 = {n,f} x9 = {n,f} x10 = ∅ Vòng lặp dừng lại lần lặp thứ 2, nghiệm nhỏ hệ phương trình cho 57 PHỤ LỤC B: TÌM ĐIỂM CỐ ĐỊNH NHỎ NHẤT CHO CHƯƠNG TRÌNH VÍ DỤ VỀ BIỂU THỨC BẬN RỘN Phương trình: x1 → JentryK = Jint a,bK x2 → Jint a,bK = Ja = x-1K x3 → Ja = x-1K = (Jb = x-2K) ↓ a ∪ {x-1} x4 → Jb = x-2K = (Jx > 0K) ↓ b ∪ {x-2} x5 → Jx > 0K = (Jreturn a*b-xK ∩ Jreturn a*bK) ∪ {x>0} x6 → Jreturn a*b-xK = Jx = x-1K ∪ {a*b-x} x7 → Jx = x-1K = (Jx>0K) ↓ x ∪ {x-1} x8 → Jreturn a*bK = JexitK ∪ {a*b} x9 → JexitK = ∅ Chuyển hàm: x1 = F1(x2) = x2 x2 = F2(x3) = x3 x3 = F3(x4) = x4 \ {a*b,a*b-x} ∪ {x-1} x4 = F4(x5) = x5 \ {a*b,a*b-x} ∪ {x-2} x5 = F5(x6; x8) = (x6 ∩ x8) ∪ {x>0} x6 = F6(x7) = x7 ∪ {a*b-x} x7 = F7(x5) = x5 \ {x-1,x-2,x>0,a*b-x} ∪ {x-1} x8 = F8(x9) = x9 ∪ {a*b} x9 = F9(x6) = ∅ Thuật tốn lặp chaotic tìm điểm cố định nhỏ nhất: x1 = x2 = x3 = x4 = x5 = x6 = x7 = x8 = x9 = ⊥ = ∅ Lặp 1: x1 = ∅ x2 = ∅ x3 = {x-1} x4 = {x-2} x5 = {x>0} 58 x6 = {a*b-x} x7 = {x-1} x8 = {a*b} x9 = ∅ Lặp 2: x1 = ∅ x2 = {x-1} x3 = {x-2,x-1} x4 = {x>0,x-2} x5 = {a*b,x>0} x6 = {a*b,a*b-x} x7 = {a*b,x-1} x8 = {a*b} x9 = ∅ Lặp 3: x1 = {x-1} x2 = {x-2,x-1} x3 = {x>0,x-2,x-1} x4 = {x>0,x-2} x5 = {x-1,a*b,a*b-x,x>0} x6 = {x-1,a*b,a*b-x} x7 = {a*b,x-1} x8 = {a*b} x9 = ∅ Lặp 4: x1 = {x-2,x-1} x2 = {x-2,x-1,x>0} x3 = {x>0,x-2,x-1} x4 = {x>0,x-2} x5 = {a*b,x>0} x6 = {x-1,a*b,a*b-x} x7 = {a*b,x-1} 59 x8 = {a*b} x9 = ∅ Lặp 5: x1 = {x-2,x-1,x>0} x2 = {x-2,x-1,x>0} x3 = {x>0,x-2,x-1} x4 = {x>0,x-2} x5 = {a*b,x>0} x6 = {x-1,a*b,a*b-x} x7 = {a*b,x-1} x8 = {a*b} x9 = ∅ Lặp 6: x1 = {x-2,x-1,x>0} x2 = {x-2,x-1,x>0} x3 = {x>0,x-2,x-1} x4 = {x>0,x-2} x5 = {a*b,x>0} x6 = {x-1,a*b,a*b-x} x7 = {a*b,x-1} x8 = {a*b} x9 = ∅ Vòng lặp dừng lại lần lặp thứ 5, nghiệm nhỏ hệ phương trình cho 60 PHỤ LỤC C: TÌM ĐIỂM CỐ ĐỊNH NHỎ NHẤT CHO CHƯƠNG TRÌNH VÍ DỤ VỀ BIỂU THỨC CĨ SẴN Phương trình: x1 → JentryK = ∅ x2 → Jint x,y,a,bK = JentryK x3 → Jy=a-bK = (Jint x,y,a,bK ∪ exps(a-b)) ↓ y x4 → Jy