Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 61 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
61
Dung lượng
2,34 MB
Nội dung
ĐẠI HỌC QUỐC GIA HÀ NỘI TRƢỜNG ĐẠI HỌC CÔNG NGHỆ NGUYỄN QUANG ĐẠI KỸ THUẬT PHÂN TÍCH CHƢƠNG TRÌNH TĨNH CHO BÀI TỐN PHÂN TÍCH HÌNH DẠNG BỘ NHỚ HEAP LUẬN VĂN THẠC SĨ CÔNG NGHỆ THÔNG TIN Hà Nội – 2015 ĐẠI HỌC QUỐC GIA HÀ NỘI TRƢỜNG ĐẠI HỌC CÔNG NGHỆ NGUYỄN QUANG ĐẠI KỸ THUẬT PHÂN TÍCH CHƢƠNG TRÌNH TĨNH CHO BÀI TỐN PHÂN TÍCH HÌNH DẠNG BỘ NHỚ HEAP Ngành: Công nghệ thông tin Chuyên ngành: Kỹ thuật phần mềm Mã số: 60480103 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 - 2015 LỜI CAM ĐOAN Tôi xin cam đoan công trình nghiên cứu tơi có giúp đỡ Thầy giáo hƣớng dẫn đồng nghiệp quan Các nội dung kết nghiên cứu luận văn hoàn toàn trung thực Trong luận văn, tơi có tham khảo đến số tài liệu số tác giả đƣợc liệt kê mục tài liệu tham khảo Hà Nội, 03 tháng 07 năm 2015 Học viên Nguyễn Quang Đại LỜI CẢM ƠN Tôi xin chân thành cảm ơn thầy cô giáo Khoa Công nghệ Thông tin, Trƣờng Đại học Công nghệ – Đại học Quốc gia Hà Nội tận tình giảng dạy trang bị cho tơi kiến thức, giúp tơi hồn thành luận văn Tơi xin đƣợc bày tỏ lịng kính trọng lời cảm ơn sâu sắc tới TS Nguyễn Trƣờng Thắng, Phó Viện trƣởng, Viện Công nghệ Thông Tin – Viện Hàn lâm Khoa học Công nghệ Việt Nam Thầy động viên hƣớng dẫn tơi hồn thành luận văn tốt nghiệp Mặc dù cố gắng để hoàn thành luận văn, nhƣng phạm vi khả cho phép khơng thể tránh khỏi thiếu sót, mong nhận đƣợc cảm thơng tận tình bảo thầy cô Hà Nội, 03 tháng 07 năm 2015 Học viên Nguyễn Quang Đại MỤC LỤC MỤC LỤC DANH MỤC CÁC KÝ HIỆU VÀ CHỮ VIẾT TẮT DANH SÁCH HÌNH VẼ MỞ ĐẦU CHƢƠNG GIỚI THIỆU CHUNG 1.1 Đặt vấn đề 1.2 Giới thiệu phân tích chƣơng trình tĩnh 1.3 Điểm mạnh điểm yếu phân tích chƣơng trình tĩnh 1.4 Các kỹ thuật phân tích chƣơng trình tĩnh CHƢƠNG LÝ THUYẾT NỀN TẢNG 11 2.1 Nền tảng phân tích ngữ nghĩa chƣơng trình 11 2.1.1 Lý thuyết giàn 11 2.1.2 Thuộc tính đóng 13 2.1.3 Phƣơng trình bất phƣơng trình 15 2.1.4 Lý thuyết điểm cố định 16 2.1.5 Các kỹ thuật tăng tốc độ hội tụ widening/narrowing 18 2.2 Kết luận chƣơng 22 CHƢƠNG PHÂN TÍCH HÌNH DẠNG HEAP 23 3.1 Phân tích trỏ 23 3.1.1 Thuật toán Andersen 23 3.1.2 Thuật toán Steensgaard 25 3.2 Phân tích trỏ liên thủ tục 26 3.3 Phân tích hình dạng nhớ heap 27 3.2.1 Kỹ thuật phân tích 29 3.2.2 Đánh giá 33 3.3 Kết luận chƣơng 33 CHƢƠNG THỰC NGHIỆM 34 4.1 Tổng quan Valgrind 34 4.1.1 Công cụ Memcheck 35 4.1.2 Biên dịch chƣơng trình với Memcheck 37 4.1.3 Lệnh kiểm tra Memcheck 37 4.2 Phân tích heap chƣơng trình Valgrind 39 4.2.1 Rò rỉ nhớ 39 4.2.2 Sử dụng nhớ không đƣợc khởi tạo 40 4.2.3 Lỗi sử dụng không malloc/ new/ new[] với free/ delete/ delete[] 43 4.2.4 Thực nghiệm chƣơng trình có mã nguồn lớn 45 KẾT LUẬN 47 TÀI LIỆU THAM KHẢO 48 PHỤ LỤC A 49 PHỤ LỤC B 51 PHỤ LỤC C 55 DANH MỤC CÁC KÝ HIỆU VÀ CHỮ VIẾT TẮT Ký hiệu Thuật ngữ CFG Control Flow Graph CG Garbage Collection DFG Data Flow Graph SMT Satisfiability Modulo Theories SAT Satisfiability Testing DANH SÁCH HÌNH VẼ Hình 2.1 Biểu đồ Hasse biểu diễn giàn 11 Hình 2.2 Quan hệ thứ tự phần giàn 12 Hình 2.3 Quan hệ thứ tự phần khơng phải giàn 12 Hình 2.4 Ví dụ giàn có chiều cao 13 Hình 2.5 Phép tốn cộng giàn 14 Hình 2.6 Phép tốn nâng (lift) giàn 14 Hình 2.7 Phép toán lift tập tạo thành giàn 14 Hình 2.8 Tính tốn điểm cố định giàn 17 Hình 2.9 Giàn có chiều cao vơ hạn 19 Hình 3.1 Quan hệ tƣơng đƣơng ràng buộc 26 Hình 3.2 Đồ thị heap 30 Hình 3.3 Đồ thị hình dạng heap sau vịng lặp 32 Hình 4.1 Kết ví dụ rị rỉ nhớ Memcheck 40 Hình 4.2 Kết ví dụ sử dụng nhớ chƣa đƣợc khởi tạo Memcheck sử dụng –track-origins 42 Hình 4.3 Kết ví dụ sử dụng nhớ chƣa đƣợc khởi tạo Memcheck không sử dụng –track-origins 43 Hình 4.4 Kết ví dụ lỗi sử dụng không malloc/new/new[] với free/delete/delete[] 44 MỞ ĐẦU Ngày với phát triển vƣợt bậc cơng nghệ thơng tin, phần mềm có vai trị cốt lõi ngày chiếm vị trí quan trọng khơng cơng nghệ thơng tin mà cịn đời sống kinh tế xã hội Vấn đề chất lƣợng phần mềm (software quality) 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 Liên quan tới đảm bảo chất lƣợng phần mềm, khía cạnh quản lý nhớ đƣợc quan tâm Quản lý nhớ đƣợc chia làm hai giai đoạn phân bổ nhớ theo u cầu, giải phóng chƣơng trình khơng cịn sử dụng Hiện nay, nhiều hệ thống ngơn ngữ lập trình sử dụng chế quản lý nhớ tự động, tiêu biểu nhƣ Java C# Trong Java, ngƣời lập trình khơng cần phải trọng đến phân bổ giải phóng nhớ Khi khối nhớ đƣợc phân bổ khơng cịn đƣợc sử dụng máy ảo Java (Java Virtual Machine) tự giải phóng nhớ thông qua chế thu dọn rác tự động (Automatic Garbage Collection) [1] Thu gom rác tự động trình kiểm tra nhớ heap, xác định đối tƣợng đƣợc sử dụng không đƣợc sử dụng, xóa đối tƣợng khơng đƣợc sử dụng Chức GC (Garbage Collection) gồm hai bƣớc trừu tƣợng (trong thực tế hai pha đan xen nhau): Phát rác (tìm đối tƣợng từ đống rác cách đó) Cải tạo rác (Cải tạo lại ô nhớ đối tƣợng rác, chƣơng trình chạy sử dụng ô nhớ này) Tuy nhiên, số ngôn ngữ lập trình truyền thống, đƣợc sử dụng phổ biến thực tế nhƣ C, C++ vấn đề quản lý nhớ đƣợc đặt hoàn toàn vào lập trình viên [6] Lập trình viên tự động cấp phát nhớ, nhƣng khối khơng cịn cần thiết, họ cần phải trả lại cho hệ thống lời gọi hàm hệ thống nhƣ free() Hậu ngƣời lập trình qn hồn trả vùng cấp phát cho nhớ lại tiếp tục dùng lệnh cấp phát, lúc nhiều phần nhớ bị chiếm chỗ Điều dẫn tới lỗi liên quan tới nhớ, đặc biệt khối nhớ khởi tạo tự động trỏ hay mắc lỗi rò rỉ nhớ (memory leak) Quản lý nhớ quan trọng có nhiều khía cạnh nghiên cứu Các kỹ thuật thu dọn rác hƣớng tiếp cận vấn đề Mục tiêu luận văn tìm hiểu kỹ thuật phân tích chƣơng trình tĩnh, cập nhật xu hƣớng nghiên cứu nƣớc lĩnh vực phân tích chƣơng trình tĩnh, cải tiến kỹ thuật Cụ thể, luận văn tập trung vào hƣớng tiếp cận tìm hiểu kỹ thuật phân tích hình dạng nhớ heap chƣơng trình Kết kỹ thuật áp dụng khâu loại bỏ đối tƣợng rác Kỹ thuật dựa lý thuyết ngữ nghĩa chƣơng trình theo trỏ Lý thuyết giàn, ngữ nghĩa điểm cố định đƣợc sử dụng nhƣ tảng kỹ thuật Luận văn có cấu trúc nhƣ sau: Chƣơng giới thiệu tổng quan phân tích chƣơng trình tĩnh Trong chƣơng trình bày định nghĩa kỹ thuật phân tích chƣơng trình tĩnh, ứng dụng, điểm mạnh điểm yếu kỹ thuật Tiếp luận văn trình bày vài kỹ thuật phân tích chƣơng trình tĩnh phổ biến nay, toán kỹ thuật mà luận văn thực tìm hiểu Chƣơng trình bày tảng ngữ nghĩa chƣơng trình Chƣơng trình bày kỹ thuật phân tích hình dạng nhớ heap Đƣa toán, cách giải đánh giá Chƣơng thực nghiệm với công cụ Valgrind Cuối phần kết luận tài liệu tham khảo 43 Hình 4.3 Kết ví dụ sử dụng nhớ chưa khởi tạo Memcheck không sử dụng –track-origins 4.2.3 Lỗi sử dụng không malloc/ new/ new[] với free/ delete/ delete[] Ví dụ: Chương trình C ghi tệp mismath-mem.c { } 44 Đoạn ví dụ ta nhận thấy biến trỏ đƣợc phân bổ lệnh malloc, nhƣng giải phóng nhớ trỏ lại dùng lệnh delete thay lệnh free Các bước phân tích Valgrind sau: Bƣớc 1: Applications -> accessories -> terminal Bƣớc 2: cd dẫn vào thƣ mục chạy valgrind: cd Desktop Bƣớc 3: Lệnh tạo môi trƣờng để kiểm tra tệp mismath-mem.c gcc mismath -mem.c -o mismath -mem -g –Wall Bƣớc 4: Lệnh kiểm tra sử dụng nhớ không đƣợc khởi tạo valgrind mismath –mem –tool=memcheck show-mismatched-frees=yes Kết Memcheck sinh hình 4.4 cho ta thấy Hình 4.4 Kết ví dụ lỗi sử dụng không malloc/new/new[] với free/delete/delete[] / 45 Thông báo sử dụng không phù hợp malloc delete 4.2.4 Thực nghiệm chương trình có mã nguồn lớn Sau thực nghiệm chạy Valgrind tập chƣơng trình có mã nguồn tƣơng đối lớn có nhiều lỗi nhớ nhƣ sử dụng biến trỏ sau giải phóng, sử dụng khối nhớ khối nhớ đƣợc cấp phát, giải phóng hai lần khối nhớ đƣợc cấp phát Các bước phân tích Valgrind sau: Bƣớc 1: Applications -> accessories -> terminal Bƣớc 2: cd dẫn vào thƣ mục chạy valgrind: cd Desktop Bƣớc 3: Lệnh tạo môi trƣờng để kiểm tra tệp large-test.c gcc large-test.c -o large-test -g Bƣớc 4: Lệnh kiểm tra sử dụng nhớ không đƣợc khởi tạo valgrind –tool=memcheck –track-origins=yes / large-test Kết Memcheck sinh hình cho ta thấy Ta thấy hình cho lỗi sử dụng nhớ ngồi khối nhớ đƣợc cấp phát 46 Hình cho ta thấy lỗi sử dụng khối nhớ giải phóng lỗi giải phóng lần khối nhớ Tất có lỗi nhớ Valgrind thống kê đƣợc Trên ví dụ thực nghiệm Valgrind chƣơng trình có số lƣợng mã nguồn lớn có nhiều lỗi nhớ gặp phải, sau sử dụng valgrind để test lỗi chƣơng trình ta thấy đƣợc kết cụ thể lỗi nhớ vị trí lỗi nhớ dong lệnh mà khơng phải chạy chƣơng trình 47 KẾT LUẬN Nội dung đạt đƣợc Đề tài tiếp cận tìm hiểu lý thuyết phƣơng pháp hình thức, cụ thể áp dụng phƣơng pháp phân tích chƣơng trình tĩnh vào giải toán kinh điển liên quan đến trỏ, tiến hành khảo sát cập nhật đƣợc xu giới phƣơng pháp hình thức, lĩnh vực ứng dụng kỹ thuật phát triển kiểm soát chất lƣợng phần mềm Luận văn tập trung chủ yếu vào nghiên cứu bản, tác giả trọng nghiên cứu lý thuyết việc xác định tính chất heap từ mã nguồn chƣơng trình Cuối cùng, dựa lý thuyết tìm hiểu tiến hành áp dụng cho tốn phân tích hình dạng heap chƣơng trình thực nghiệm công cụ Valgrind Hạn chế Hiện việc áp dụng lý thuyết vào thực tế cịn nhiều khó khăn, công cụ hỗ trợ hầu hết dừng mức thử nghiệm cho nghiên cứu Hƣớng phát triển Thực áp dụng, cải tiến lý thuyết để tăng khả ứng dụng Sử dụng công cụ mã nguồn mở có sẵn làm tảng để thực việc cải tiến đƣa vào ứng dụng thực tế 48 TÀI LIỆU THAM KHẢO [1] Buytaert D, Venstermans K, Eeckhout L, BosschereK D, Garbage Collection Hints ELIS Department, Ghent University – HiPEAC Member, St.-Pietersnieuwstraat 41, B-9000 Gent, Belgium [2] Cousot P (2001), Abstract interpretation based formal methods and futurechallenges, Lecture Notes in Computer Science 2000, (138–170) [3] Cousot P Abstract Interpretation Web page maintained by P Cousot, 2008 [4] Cousot P Constructive Design of a Hierarchy of Semantics of a Transition System by Abstract Interpretation In Electronic Notes in Theoretical Computer Science, Volume 6, 1997 [5] Clarke E.M, Grumberg O, Peled D.A (1999), Model Checking The MIT Press [6] Jon Rafkind, Adam Wick, John Regehr, Matthew Flatt Precise Garbage Collection for C [7] Julian Seward, Nicholas Nethercote Using Valgrind to detect undefined value errors with bit-precision [8] Nielson F., Nielson H.R., Hankin C (2004), Principles of Program Analysis, Springer [9] Rice H.G (1953), Classes of recursively enumerable sets and their decisionproblems, Transactions of American Math Society 74, (358-366) [10] Schwartzbach M.I (2008), Lecture notes on static analysis Technical report, BRICS, Dept of Computer Science - University of Aarhus [11] Sagiv M, Reps T, and Wilhelm R Parametric shape analysis via 3-valued logic ACM Transactions on Programming Languages and Systems (TOPLAS), 24(3):217–298, 2002 [12] Thomas Reps, Mooly Sagiv, Reinhard Wilhelm, Static Program Analysis via 3-Valued Logic* [13] http://valgrind.org/ [14] Wogerer W (2005), A Survey of Static Program Analysis Techniques, Technische Universitat Wien 49 PHỤ LỤC A Giải hệ phƣơng trình cho ví dụ thuật tốn Andersen Ta có hệ phƣơng trình: { ⟦ ⟧ ⟦ ⟧ ⟦ ⟧ ⟦ ⟧ ⟦ ⟧ ⟦ ⟧ ⟦ ⟧ { ⟦ ⟧ } ⟦ ⟧ ⟦ ⟧ ⟦ ⟧ ⟦ ⟧ ⟦ ⟧ ⟦ ⟧ ⟦ ⟧ ⟦ ⟧ ⟦ ⟧ ⟦ ⟧ ⟦ ⟧ } ⟦ ⟧ ⟦ ⟧ Hệ phƣơng trình tƣơng đƣơng với: { } ⟦ ⟧ ⟦ ⟧ ⟦ ⟧ ⟦ ⟧ { } ⟦ ⟧ ⟦ ⟧ ⟦ ⟧ ⟦ ⟧ ⟦ ⟧ ⟦ ⟧ ⟦ ⟧ ⟦ ⟧ Hệ phƣơng trình tƣơng đƣơng với: { } ⟦ ⟧ ⟦ ⟧ ⟦ ⟧ ⟦ ⟧ { } ⟦ ⟧ ⟦ ⟧ ⟦ ⟧ ⟦ ⟧ 50 Hệ phƣơng trình tƣơng đƣơng với: { } ⟦ ⟧ { ⟦ ⟧ ⟦ ⟧ } ⟦ ⟧ Hệ phƣơng trình tƣơng đƣơng với: { { } } ⟦ ⟧ ⟦ ⟧ Kết ta thu là: ⟦ ⟧ { ⟦ ⟧ { } } 51 PHỤ LỤC B Giải hệ phƣơng trình cho ví dụ tốn phân tích hình dạng nhớ heap Ta có hệ phƣơng trình ⟦ ⟧ { } ⟦ ⟧ { } ⟦ ⟧ { } ⟦ ⟧ { } ⟦ ⟧ ⟦ ⟧ ⟦ ⟧ ⟦ ⟧ ⟦ ⟧ ⟦ ⟧ ⟦ ⟧ ⟦ ⟧ ⟦ ⟧ Hệ phƣơng trình tƣơng đƣơng với: ⟦ ⟧ ⟦ ⟧ ⟦ ⟧ { ⟦ } ⟧ ⟦ ⟧ ⟧ { } ⟧ } { } ⟦ ⟧ ⟦ { } ⟧ } ⟦ { { } ⟦ { ⟦ { { } ⟧ } { } ⟦ 52 ⟧ { { ⟦ ⟧ } } ⟦ ⟧ { { ⟦ ⟧ } } ⟦ ⟧ ⟦ { { ⟧ } } ⟦ ⟧ ⟦ { { ⟧ } } ⟦ ⟧ ⟦ ⟧ { { } } ⟦ ⟧ ⟦ ⟧ { { } } ⟦ 53 ⟧ ⟦ ⟧ { { } } Hệ phƣơng trình tƣơng đƣơng với: ⟦ ⟧ ⟦ ⟧ ⟦ ⟦ ⟧ ⟦ ⟦ ⟧ ⟧ ⟦ ⟧ { } { } { } ⟧ ⟦ { ⟧ } ⟦ ⟧ ⟦ { ⟧ } ⟦ ⟧ ⟦ { ⟧ } ⟦ ⟧ { } ⟦ ⟧ { } ⟦ ⟧ { } ⟦ ⟧ 54 { } ⟦ ⟧ { } ⟦ ⟧ { } Kết thu là: { } 55 PHỤ LỤC C Chƣơng trình C đƣợc ghi tệp large-test.c có nội dung nhƣ sau: { { } { } 56 { } } { { { { } 57 { } } { { } } { { } } } } ... để tìm đƣợc kết hình dạng cuối heap 29 3.2.1 Kỹ thuật phân tích Trong phân tích hình dạng nhớ heap, đồ thị hình dạng shape graph dùng để mơ tả hình dạng nhớ heap Đồ thị hình dạng đồ thị có hƣớng... NGUYỄN QUANG ĐẠI KỸ THUẬT PHÂN TÍCH CHƢƠNG TRÌNH TĨNH CHO BÀI TỐN PHÂN TÍCH HÌNH DẠNG BỘ NHỚ HEAP Ngành: Công nghệ thông tin Chuyên ngành: Kỹ thuật phần mềm Mã số: 60480103 LUẬN VĂN THẠC SĨ CÔNG... Các kỹ thuật 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 nhƣng tựu chung phân theo nhóm nhƣ sau: Thứ nhất, kỹ thuật phân