1. Trang chủ
  2. » Luận Văn - Báo Cáo

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

11 493 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 11
Dung lượng 2,14 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

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 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 3

LỜ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 4

LỜ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 5

1

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 6

2

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 7

3

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 8

4

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 9

5

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 10

6 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 11

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

Ngày đăng: 27/08/2016, 08:56

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w