Tải bản đầy đủ (.pdf) (11 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.14 MB, 11 trang )

ĐẠ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


ĐẠ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


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


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



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


4.1.

2
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


3

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


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


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


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.


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]. />[14]. Wogerer W (2005), A Survey of Static Program Analysis Techniques,
Technische Universitat Wien.



×