ĐẠ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 TOÁN PHÂN TÍCH HÌNH DẠNG BỘ NHỚ HEAP LUẬN VĂN THẠC SĨ CÔNG NGHỆ THÔNG T
Trang 1ĐẠ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 TOÁ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
Trang 2ĐẠ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 TOÁ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
Trang 3LỜI CAM ĐOAN
Tôi xin cam đoan rằng đây là công trình nghiên cứu của tôi trong đó có sự giúp đỡ của Thầy giáo hướng dẫn và các đồng nghiệp tại cơ quan Các nội dung
và kết quả nghiên cứu trong luận văn này là hoàn toàn trung thực
Trong luận văn, tôi có tham khảo đến một số tài liệu của một số tác giả được liệt kê tại 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
Trang 4LỜI CẢM ƠN
Tôi xin chân thành cảm ơn các thầy cô giáo trong 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 hoàn thành luận văn
Tôi cũng xin được bày tỏ lòng kính trọng và lời cảm ơn sâu sắc nhất 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 và Công nghệ Việt Nam Thầy đã luôn động viên và hướng dẫn tôi hoà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 trong phạm vi và khả năng cho phép không thể tránh khỏi những thiếu sót, mong nhận được sự cảm thông và tận tình chỉ bảo của các thầy cô
Hà Nội, 03 tháng 07 năm 2015
Học viên
Nguyễn Quang Đại
Trang 51
MỤC LỤC
MỤC LỤC 1
DANH MỤC CÁC KÝ HIỆU VÀ CHỮ VIẾT TẮT 3
DANH SÁCH HÌNH VẼ 4
MỞ ĐẦU 5
CHƯƠNG 1 GIỚI THIỆU CHUNG 7
1.1 Đặt vấn đề 7
1.2 Giới thiệu phân tích chương trình tĩnh 7
1.3 Điểm mạnh và điểm yếu của phân tích chương trình tĩnh 8
1.4 Các kỹ thuật phân tích chương trình tĩnh 8
CHƯƠNG 2 LÝ THUYẾT NỀN TẢNG 11
2.1 Nền tảng phân tích ngữ nghĩa củ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 và 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 3 PHÂN TÍCH HÌNH DẠNG HEAP 23
3.1 Phân tích con 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 con trỏ liên thủ tục 26
3.3 Phân tích hình dạng bộ 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 4 THỰC NGHIỆM 34
Trang 62
4.1 Tổng quan về 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 trong Memcheck 37
4.2 Phân tích heap của chương trình trong Valgrind 39
4.2.1 Rò rỉ bộ nhớ 39
4.2.2 Sử dụng bộ nhớ không được khởi tạo 40
4.2.3 Lỗi sử dụng không đúng giữa malloc/ new/ new[] với free/ delete/ delete[] 43
4.2.4 Thực nghiệm trên 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
Trang 73
DANH MỤC CÁC KÝ HIỆU VÀ CHỮ VIẾT TẮT
CFG Control Flow Graph
CG Garbage Collection
DFG Data Flow Graph
SMT Satisfiability Modulo Theories
SAT Satisfiability Testing
Trang 84
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ự từng phần là giàn 12
Hình 2.3 Quan hệ thứ tự từng phần không phải giàn 12
Hình 2.4 Ví dụ giàn có chiều cao là 4 13
Hình 2.5 Phép toán cộng giàn 14
Hình 2.6 Phép toán nâng (lift) giàn 14
Hình 2.7 Phép toán lift của các tập tạo thành giàn 14
Hình 2.8 Tính toán điểm cố định trên 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 giữa các 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 quả ví dụ rò rỉ bộ nhớ trong Memcheck 40
Hình 4.2 Kết quả ví dụ sử dụng bộ nhớ chưa được khởi tạo trong Memcheck sử dụng –track-origins 42
Hình 4.3 Kết quả ví dụ sử dụng bộ nhớ chưa được khởi tạo trong Memcheck không sử dụng –track-origins 43
Hình 4.4 Kết quả ví dụ lỗi sử dụng không đúng giữa malloc/new/new[] với free/delete/delete[] 44
Trang 95
MỞ ĐẦU
Ngày nay với sự phát triển vượt bậc của công nghệ thông tin, thì phần mềm
có vai trò cốt lõi và ngày càng chiếm vị trí quan trọng không những trong công nghệ thông tin mà còn trong đời sống kinh tế xã hội Vấn đề chất lượng phần
mềm (software quality) chắc chắn là mối quan tâm và thách thức đối với xã hội
hiện đại ngày càng phụ thuộc vào các dịch vụ do máy tính đem lại này
Liên quan tới đảm bảo chất lượng phần mềm, khía cạnh quản lý bộ nhớ cũng rất được quan tâm Quản lý bộ nhớ được chia làm hai giai đoạn chính là phân bổ
bộ nhớ theo yêu cầu, và giải phóng khi 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 cơ chế quản lý bộ nhớ tự động, tiêu biểu như Java và C# Trong Java, người lập trình không cần phải chú trọng đến phân bổ và giải phóng bộ nhớ Khi khối bộ nhớ được phân bổ không còn
được sử dụng máy ảo Java (Java Virtual Machine) sẽ tự giải phóng bộ nhớ thông qua cơ chế thu dọn rác tự động (Automatic Garbage Collection) [1] Thu
gom rác tự động là quá trình kiểm tra bộ nhớ heap, xác định những đối tượng đang được sử dụng và không được sử dụng, và xóa những đối tượng không được
sử dụng Chức năng cơ bản của GC (Garbage Collection) là gồm hai bước trừu
tượng (trong thực tế hai pha này có thế đan xen nhau):
Phát hiện rác (tìm đối tượng từ đống rác bằng một cách nào đó)
Cải tạo rác (Cải tạo lại ô nhớ của đối tượng rác, khi đó chương trình đang chạy có thể sử dụng ô nhớ này)
Tuy nhiên, một số ngôn ngữ lập trình truyền thống, được sử dụng phổ biến trong thực tế như C, C++ thì vấn đề quản lý bộ nhớ vẫn đượ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 bộ nhớ, nhưng khi một khối không còn cần thiết, họ cần phải trả lại cho hệ thống bằng lời gọi hàm hệ thống
như free() Hậu quả là nếu người lập trình quên hoàn trả các vùng đã cấp phát về
cho bộ nhớ và lại tiếp tục dùng các lệnh cấp phát, thì càng lúc càng nhiều các phần của bộ nhớ bị chiếm chỗ Điều này có thể dẫn tới các lỗi liên quan tới bộ nhớ, đặc biệt là khối bộ nhớ khởi tạo tự động bởi con trỏ hay mắc lỗi rò rỉ bộ
nhớ (memory leak) Quản lý bộ nhớ là quan trọng và có nhiều khía cạnh nghiên
cứu Các kỹ thuật thu dọn rác là một hướng tiếp cận của vấn đề này
Mục tiêu của luận văn này là tìm hiểu về kỹ thuật phân tích chương trình tĩnh, cập nhật những xu hướng nghiên cứu trong và ngoài nước về lĩnh vực phân tích chương trình tĩnh, và cải tiến những kỹ thuật này Cụ thể, luận văn tập trung vào hướng tiếp cận là tìm hiểu kỹ thuật phân tích hình dạng bộ nhớ heap của
Trang 106 chương trình Kết quả của kỹ thuật có thể áp dụng trong khâu loại bỏ các đối tượng là rác Kỹ thuật dựa trên lý thuyết ngữ nghĩa chương trình theo các con trỏ Lý thuyết giàn, ngữ nghĩa điểm cố định cũng sẽ được sử dụng như nền tảng của kỹ thuật này
Luận văn có cấu trúc như sau:
Chương 1 giới thiệu tổng quan về 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, điểm mạnh và điểm yếu của kỹ thuật này Tiếp đó luận văn trình bày một vài kỹ thuật phân tích chương trình tĩnh phổ biến hiện nay, bài toán và kỹ thuật mà luận văn thực hiện tìm hiểu
Chương 2 trình bày nền tảng ngữ nghĩa của một chương trình
Chương 3 trình bày về kỹ thuật phân tích hình dạng bộ nhớ heap Đưa ra các bài toán, cách giải quyết và đánh giá
Chương 4 thực nghiệm với công cụ Valgrind
Cuối cùng là phần kết luận và tài liệu tham khảo
Trang 1148
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