Luận văn: Kỹ thuật phân tích tĩnh hình dạng bộ nhớ Heap (Nguyễn Quang Đại)

Luận văn thạc sĩ: Nghiên cứu kỹ thuật phân tích chương trình tĩnh để giải quyết bài toán phân tích hình dạng bộ nhớ heap. Tìm hiểu và ứng dụng hiệu quả.

Chuyên ngành

Công Nghệ Thông Tin

Người đăng

Ẩn danh

Thể loại

Luận Văn Thạc Sĩ

2015

61
1
0

Phí lưu trữ

30 Point

Mục lục chi tiết

LỜI CAM ĐOAN

LỜI CẢM ƠN

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

1. CHƢƠNG 1: 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 và điểm yếu của 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

2. CHƢƠNG 2: LÝ THUYẾT NỀN TẢNG

2.1. Nền tảng phân tích ngữ nghĩa của chƣơng trình

2.2. Lý thuyết giàn

2.3. Thuộc tính đóng

3. PHÂN TÍCH HÌNH DẠNG HEAP

3.1. Phân tích con trỏ

3.2. Phân tích hình dạng bộ nhớ heap

4. Tổng quan về Valgrind

TÀI LIỆU THAM KHẢO

Tóm tắt

I. Tổng Quan Phân Tích Tĩnh Heap Nâng Cao Chất Lượng Phần Mềm

Với sự phát triển mạnh mẽ của công nghệ thông tin, phần mềm đóng vai trò quan trọng trong nhiều lĩnh vực. Chất lượng phần mềm trở thành mối quan tâm hàng đầu, đặc biệt là trong bối cảnh phụ thuộc ngày càng tăng vào các dịch vụ máy tính. Quản lý bộ nhớ, bao gồm phân bổ và giải phóng, là một khía cạnh quan trọng trong đảm bảo chất lượng phần mềm. Nhiều ngôn ngữ lập trình hiện đại như Java và C# sử dụng cơ chế quản lý bộ nhớ tự động (Automatic Garbage Collection - GC). Trong Java, lập trình viên không cần trực tiếp quản lý bộ nhớ, vì JVM sẽ tự động giải phóng bộ nhớ không sử dụng thông qua thu gom rác tự động. GC bao gồm hai bước chính: phát hiện rác và cải tạo rác. Tuy nhiên, các ngôn ngữ như C và C++ vẫn yêu cầu lập trình viên tự quản lý bộ nhớ, điều này dẫn đến nguy cơ rò rỉ bộ nhớ (memory leak) nếu lập trình viên quên giải phóng vùng nhớ đã cấp phát. Việc quản lý bộ nhớ hiệu quả là rất quan trọng, và các kỹ thuật thu dọn rác là một trong những hướng tiếp cận. Luận văn này tập trung vào kỹ thuật phân tích chương trình tĩnh, cụ thể là phân tích hình dạng bộ nhớ heap, để cải thiện quản lý bộ nhớ và giảm thiểu rò rỉ.

1.1. Giới Thiệu Chi Tiết Phân Tích Chương Trình Tĩnh

Phân tích chương trình tĩnh là kỹ thuật xác định các thuộc tính và hành vi của chương trình mà không cần thực thi nó. Các câu hỏi liên quan đến chương trình hoặc các điểm riêng lẻ trong chương trình bao gồm: liệu chương trình có dừng không, kích thước vùng nhớ heap, đầu ra có thể, giá trị có được đọc trong tương lai, các điểm có cấu trúc tách rời nhau trong heap không, con trỏ có thể null không, và biến đã được khởi tạo trước khi đọc chưa. Theo lý thuyết Rice, hầu hết các câu hỏi liên quan đến hành vi chương trình đều là không quyết định được. Để giải quyết vấn đề này, các kỹ thuật xấp xỉ được sử dụng để đưa về các bài toán có thể giải được hoặc để tối ưu hóa kết quả. Luận văn này tập trung vào phân tích chương trình tĩnh thay vì mô hình hóa, và sẽ đi sâu vào một bài toán đặc trưng và các hướng giải quyết của nó.

1.2. Điểm Mạnh Và Điểm Yếu Của Phân Tích Tĩnh

Phân tích chương trình tĩnh có nhiều ưu điểm, bao gồm khả năng chỉ ra chính xác vị trí lỗi, phát hiện lỗi sớm trong quy trình phát triển phần mềm, khả năng tự động hóa nhanh thông qua các công cụ như TVLA, Astree, SOOT, Valgrind, và dễ dàng thực hiện bởi các chuyên gia kiểm định chất lượng phần mềm. Tuy nhiên, kỹ thuật này có hạn chế khi xuất hiện các tham chiếu và ràng buộc nằm ngoài phạm vi suy luận biểu trưng của chương trình, do bản chất của phân tích tĩnh là không chạy với dữ liệu cụ thể. Một số điểm yếu không khắc phục được bao gồm: không phát hiện được lỗi chỉ xuất hiện khi chạy chương trình, mất thời gian nếu thực hiện thủ công, tự động hóa chỉ hướng vào một số ngôn ngữ nhất định, đòi hỏi kiến thức về ngôn ngữ lập trình, và có thể sinh ra nhiều cảnh báo lỗi không chính xác.

II. Khám Phá Lý Thuyết Nền Tảng Của Phân Tích Ngữ Nghĩa

Trong kỹ thuật phân tích chương trình tĩnh, các phân tích sử dụng cấu trúc toán học là Giàn (Lattices), tập các thuộc tính cần thiết cho mỗi phân tích tĩnh trong chương trình. Một thứ tự bộ phận (Partial order) là một cấu trúc toán học, trong đó là một tập hợp và là một quan hệ 2 ngôi trên thỏa mãn các điều kiện phản xạ, bắc cầu, và phản đối xứng. Giàn là một quan hệ thứ tự từng phần mà trong đó và tồn tại đối với tất cả . Khi xem xét các giàn hữu hạn, yêu cầu ít nhất là tồn tại phần tử lớn nhất và nhỏ nhất. Nếu là những giàn với độ cao hữu hạn, từ đó một phép toán tích và một phép toán cộng được định nghĩa.

2.1. Thuộc Tính Đóng Trong Phân Tích Tĩnh Chương Trình

Nếu giàn là một giàn với độ cao hữu hạn, khi đó, độ cao của giàn là. Nếu là một tập hữu hạn, khi đó là một giàn có độ cao là 2. Cuối cùng, nếu và được định nghĩa như trên, khi đó chúng ta thu được một giàn ánh xạ với độ cao theo từng điểm thứ tự. Nếu là hữu hạn và có độ cao hữu hạn khi đó.

2.2. Phương Trình Và Bất Phương Trình Trong Phân Tích Ngữ Nghĩa

Trong phân tích mã nguồn chương trình, lý thuyết giàn ngữ nghĩa được sử dụng. Từng nút trong mã nguồn sẽ được gắn một giá trị ngữ nghĩa (semantic). Ngữ nghĩa của một nút chịu sự ràng buộc trong mối quan hệ với các nút ở trước và sau nó trong mã nguồn chương trình tùy theo ngữ nghĩa của các câu lệnh đối với một thuộc tính cần xem xét. Những mối quan hệ ràng buộc thể hiện là các hàm (hàm chuyển đổi ngữ nghĩa). Cho là một giàn với độ cao hữu hạn. Một hệ phương trình được biểu diễn, với là những biến và là một tập những hàm đơn điệu. Mỗi hệ chỉ có nghiệm nhỏ nhất duy nhất, nghiệm đó được gọi là điểm cố định nhỏ nhất của hàm được định nghĩa bởi.

2.3. Lý Thuyết Điểm Cố Định Trong Phân Tích Chương Trình Tĩnh

Hàm là đơn điệu khi . Lý thuyết về điểm cố định như sau: trong một giàn có chiều cao hữu hạn, mỗi hàm đơn điệu f có duy nhất một điểm cố định nhỏ nhất (least fixed-point) định nghĩa như sau: thỏa mãn . Độ phức tạp tính toán một điểm cố định phụ thuộc vào 3 yếu tố: Độ cao của giàn, chi phí tính toán của hàm, và chi phí so sánh kết quả có bằng nhau sau mỗi bước lặp. Tính toán một điểm cố định có thể được minh họa bằng các bước đi lên trong một giàn bắt đầu từ điểm.

III. Phân Tích Hình Dạng Heap Giải Pháp Quản Lý Bộ Nhớ Tối Ưu

Phân tích hình dạng là việc xác định tĩnh và tự động các tính chất của heap của một chương trình (còn được gọi là Store). Mỗi trạng thái của heap có thể được biểu diễn thông qua một đồ thị gồm các nút đại diện cho các khối bộ nhớ đã được cấp phát và các cạnh biểu diễn con trỏ giữa các khối bộ nhớ, cùng với các biến của chương trình cũng có thể trỏ tới các nút trong heap. Hiện nay, phân tích hình dạng bộ nhớ heap có thể tiếp cận theo nhiều cách khác nhau, và có thể thực hiện ở nhiều mức (mức cụ thể, mức trừu tượng). Mục tiêu của phân tích hình dạng là xác định, tại mỗi điểm của chương trình, một tập đồ thị hình dạng thể hiện tất cả các cấu trúc heap có thể xảy ra trong quá trình thực thi chương trình tại thời điểm đó.

3.1. Phân Tích Con Trỏ Cơ Sở Của Phân Tích Hình Dạng Heap

Trong khoa học máy tính, phân tích con trỏ (pointer analysis), hay gọi là points – to analysis, là kỹ thuật phân tích mã nguồn tĩnh xác định một tập các đối tượng là các con trỏ, hoặc các tham chiếu heap gọi là các đích, có thể trỏ tới bởi các biến hoặc nơi lưu trữ. Cách chọn kinh điển nhất là tạo một đích cho mọi biến tên và đích malloc – i, với là duy nhất, cho mỗi vị trí được cấp phát khác nhau (điểm mà chương trình thực hiện thao tác malloc). Phân tích points – to được thực hiện dựa trên cây phân tích cú pháp. Kết quả cuối cùng của phân tích points – to là một hàm mà với mỗi biến (con trỏ) trả lại một tập của các đích con trỏ mà nó có thể trỏ tới.

3.2. Kỹ Thuật Phân Tích Hình Dạng Heap Chi Tiết

Trong phân tích hình dạng bộ nhớ heap, đồ thị hình dạng shape graph dùng để mô tả hình dạng bộ nhớ heap. Đồ thị hình dạng là đồ thị có hướng với nút là các con trỏ đích, cạnh là các tham chiếu có thể. Với mọi nút của CFG dựa trên lý thuyết giàn ta tạo một biến ràng buộc để mô tả hình dạng heap sau khi chương trình đi qua nút. Với các nút tương ứng với thao tác con trỏ có các ràng buộc được thiết lập.

3.3. Đánh Giá Ưu Điểm Của Kỹ Thuật Phân Tích Hình Dạng

Phân tích hình dạng chính xác hơn, nhưng rõ ràng là nó cũng tốn kém để thực hiện hơn so với các thuật toán phân tích points – to khác. Tuy nhiên, ta có thể tăng độ chính xác hơn của phân tích hình bằng cách sử dụng một cách tiếp cận nào đó của phân tích points – to để giảm số đích được xem xét trong các hàm left và right. Kết quả của phân tích hình dạng có nhiều ứng dụng, rất cần thiết đối với một số dạng kiểm chứng chương trình như xác định có tham chiếu con trỏ null trong chương trình hay không, hoặc cho 2 nút, bắt đầu từ một nút liệu có thể tới được nút còn lại thông qua các kết nối con trỏ không.

IV. Thực Nghiệm Valgrind Công Cụ Kiểm Tra Lỗi Bộ Nhớ Heap

Valgrind là một bộ công cụ cung cấp một số công cụ gỡ lỗi và điều chỉnh giúp chạy nhanh hơn và chính xác hơn, hỗ trợ chạy trên nền tảng LINUX. Valgrinds hỗ trợ một số công cụ gỡ lỗi và điều chỉnh như Memcheck, Cachegrind, Callgrind, Massif, Helgrind, DRD, Lackey, Nulgrind. Memcheck là công cụ phổ biến và mặc định của Valgrind. Nó xác định nhiều vấn đề liên quan đến bộ nhớ heap, và chủ yếu hướng tới chương trình viết bằng C và C++. Khi chương trình chạy dưới sự kiểm soát của Memcheck, tất cả các lời gọi đọc và ghi của bộ nhớ sẽ được kiểm tra và phát hiện các lỗi.

4.1. Tổng Quan Về Công Cụ Valgrind Memcheck

Memcheck thực thi một CPU mô phỏng giống hệt CPU thật. Trong đó, mỗi byte trong bộ nhớ được thể hiện bởi một bit định địa chỉ, chỉ ra rằng chương trình có thể truy cập byte đó hợp lệ hay không. Bit A được cập nhật bằng các thao tác khởi tạo hoặc giải phóng bộ nhớ. Mỗi byte trong thanh ghi và bộ nhớ được thể hiện bởi 8 bit giá trị, chỉ ra rằng giá trị tại bit đó đã được định nghĩa hay chưa, theo sự xấp xỉ của máy tính. Mỗi khối heap được phân bổ, Memcheck ghi lại địa chỉ của nó và hàm phân bổ nó dùng.

4.2. Các Loại Lỗi Bộ Nhớ Heap Được Memcheck Phát Hiện

Các lỗi mà Memcheck có thể phát hiện bao gồm sử dụng bộ nhớ chưa khởi tạo, đọc/ghi vào bộ nhớ sau khi khối nhớ đã được giải phóng, đọc/ghi vào cuối của khối nhớ malloc, rò rỉ bộ nhớ, lỗi sử dụng không đúng giữa malloc/ new/ new[] với free/ delete/ delete[], và giải phóng bộ nhớ sai. Tuy nhiên, Memcheck chỉ được sử dụng với một số bài toán, với mục đích cụ thể là các lỗi mà Memcheck có thể kiểm tra.

4.3. Hướng Dẫn Sử Dụng Các Lệnh Kiểm Tra Trong Memcheck

Trong Memcheck có rất nhiều loại lệnh kiểm tra được sử dụng để kiểm tra các lỗi có thể có trong chương trình C. Các lệnh phổ biến, thường xuyên được dùng trong Memcheck bao gồm --leak-check, --track-origins, --show-mismatched-frees, --show-leak-kinds, --show-reachable, và --show-possibly-lost. Các lệnh này giúp kiểm tra rò rỉ bộ nhớ, theo dõi nguồn gốc giá trị chưa khởi tạo, và kiểm tra tính phù hợp giữa lệnh cấp phát và giải phóng bộ nhớ.

24/09/2025

Trích đoạn nội dung tài liệu

Đặt vấn đề Với sự tiến bộ nhanh chóng của cách mạng công nghệ thông tin và chất liệu chính là phần mềm. Nếu nhƣ trƣớc đây phần mềm máy tính chỉ đƣợc sử dụng để tính toán khoa học kỹ thuật và xử lý dữ liệu thì ngày nay nó đã đƣợc ứng dụng vào mọi mặt của đời sống hàng ngày của con ngƣời. Vì thế con ngƣời ngày càng phụ thuộc chặt chẽ vào các sản phẩm phần mềm và do vậy đòi hỏi về chất lƣợng của các sản phẩm phần mềm ngày càng cao, tức là phần mềm phải đƣợc sản xuất với giá thành thấp, dễ dùng, an toàn và tin cậy đƣợc. Đánh giá chất lƣợng phần mềm thông thƣờng qua các hoạt động phổ biến nhƣ tìm xem phần mềm có lỗi không và có những kỹ thuật nào để phát hiện các lỗi đó.

Việc phát hiện lỗi hay bất cứ vấn đề gì về sản phẩm đều có thể thực hiện ở các mức của quá trình sản xuất phần mềm nhƣ mức phân tích, mức thiết kế và mức lập trình. Ở mức lập trình việc phát hiện lỗi trở nên phức tạp và khó giải quyết hơn. Cụ thể nhƣ bài toán quản lý bộ nhớ. 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#.

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 dựa hoàn toàn vào lập trình viên. Liên quan tới bài toán này kỹ thuật phân tích chƣơng trình tĩnh của mảng các kỹ thuật kiểm chứng chƣơng trình là có tính ứng dụng và hiệu quả cao. Và việc áp dụng kỹ thuật phân tích chƣơng trình tĩnh vào trong bài toán quản lý bộ nhớ sẽ là nội dung chính của luận văn này. Giới thiệu phân tích chƣơng trình tĩnh Phân tích chƣơng trình tĩnh là kỹ thuật xác định tính chất/ hành vi của một chƣơng trình mà không cần phải chạy chƣơng trình đó.

Có rất nhiều câu hỏi thú vị liên quan tới chƣơng trình hoặc các điểm (point) riêng lẻ trong chƣơng trình:  Chƣơng trình có dừng hay không?  Độ lớn có thể của vùng nhớ heap trong quá trình chạy nhƣ thế nào?  Đầu ra (output) có thể là gì?  Giá trị của sẽ đƣợc đọc trong tƣơng lai?  Điểm và có cấu trúc tách rời nhau trong heap?  Con trỏ có thể null?  Biến đã đƣợc khởi tạo trƣớc đọc hay không?  v. TIEU LUAN MOI download : skknchat@gmail.com 8 Theo lý thuyết Rice [9], tất cả các câu hỏi liên quan tới hành vi chƣơng trình là không quyết định đƣợc (undecidable). Việc xử lý vấn đề này luôn đi kèm một số kĩ thuật xấp xỉ nhằm đƣa về bài toán giải đƣợc hoặc để tối ƣu hóa kết quả. Thay vì mức mô hình nhƣ 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 sẽ đi sâu tìm hiểu về một bài toán đặc trƣng trong phân tích chƣơng trình tĩnh và các hƣớng giải quyết của bài toán đó. Điểm mạnh và điểm yếu của phân tích chƣơng trình tĩnh Phân tích chƣơng trình tĩnh có một số ƣu điểm sau:  Chỉ ra đƣợc chính xác vị trí lỗi trong chƣơng trình.  Lỗi đƣợc phát hiện sớm trong quy trình phát triển phần mềm nên chi phí sửa thấp.  Tự động hóa nhanh: thông qua các công cụ hỗ trợ nhƣ TVLA, Astree, SOOT, Valgrind …  Dễ dàng thực hiện bởi những chuyên gia kiểm định chất lƣợng phần mềm hiểu rõ về mã nguồn.

Tuy nhiên, điểm yếu của kỹ thuật này xuất hiện khi tại một câu lệnh xuất hiện những tham chiếu, ràng buộc nằm ngoài phạm vi suy luận biểu trƣng của chƣơng trình. Hạn chế này là bản chất của việc phân tích tĩnh - không chạy với dữ liệu cụ thể. Một số điểm yếu không khắc phục đƣợc:  Không phát hiện đƣợc lỗi chỉ xuất hiện khi chạy chƣơng trình(run- time error).  Mất thời gian nếu thực hiện bằng tay.

 Việc tự động hóa chỉ hƣớng vào một số ngôn ngữ nhất định.  Đòi hỏi nhân lực phải có kiến thức về ngôn ngữ lập trình.  Có thể sinh ra nhiều lời cảnh báo lỗi không chính xác. 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 đã và đang thu hút nhiều nghiên cứu trên thế giới, hiện có nhiều kỹ thuật nhƣng tựu chung có thể phân theo 4 nhóm chính nhƣ sau: Thứ nhất, kỹ thuật phân tích chƣơng trình tĩnh dựa trên phân tích luồng dữ liệu (data flow analysis) [8] [10].

Phân tích luồng dữ liệu là một kỹ thuật thu thập thông tin về tập các giá trị đƣợc tính toán có thể có tại các điểm khác nhau của chƣơng trình. Thông tin thu đƣợc thƣờng đƣợc trình biên dịch sử dụng để tối TIEU LUAN MOI download : skknchat@gmail.com 9 ƣu hóa chƣơng trình. Phân tích luồng dữ liệu là một cách rất hiệu quả và khả thi trong việc phát hiện lỗi chƣơng trình và tối ƣu hóa trong các trình biên dịch. Cách đơn giản để phân tích luồng dữ liệu là thiết lập phƣơng trình luồng dữ liệu cho mỗi nút của đồ thị luồng dữ liệu (DFG – data flow graph) và sử dụng thuật toán điểm cố định để giải hệ phƣơng trình này.

Và một số ứng dụng phổ biển của phân tích luồng dữ liệu là phân tích tính tới đƣợc (reaching definitions), biểu thức có sẵn (available expressions), biểu thức bận rộn (very busy expressions) và phân tích tính sống (liveness analysis) [10] Thứ hai, nhóm kỹ thuật liên quan tới xấp xỉ ngữ nghĩa đƣợc gọi là diễn giải trừu tƣợng (abstract interpretation) [2] [3]. Kỹ thuật diễn giải trừu tƣợng dựa trên nguyên tắc xấp xỉ ngữ nghĩa của chƣơng trình khi kiểm tra đối chiếu sự thỏa mãn đặc tả. Kỹ thuật này trích ra từ một ngữ nghĩa chuẩn (standard semantics) đƣợc một ngữ nghĩa trừu tƣợng đã xấp xỉ và tính toán đƣợc (approximate and computable abstract semantics). Quá trình chuyển này không hoàn toàn tự động mà có thể cần sự tƣơng tác với ngƣời dùng để tinh chỉnh (refinement) các ánh xạ trừu tƣợng thông qua các tham số đƣa vào, bởi vì có thể đầu tiên tạo ra (là ngữ nghĩa trừu tƣợng từ chƣơng trình ) không thỏa mãn đặc tả , trƣớc hết phải tinh chỉnh chứ không kết luận ngay là không thỏa mãn do tính không hoàn chỉnh (incompleteness) của kỹ thuật diễn giải trừu tƣợng.

Thay vì kiểm chứng đặc tả trên , chúng ta kiểm chứng đối với ngữ nghĩa trừu tƣợng của. Nếu thỏa mãn bởi , do tính đúng đắn của kỹ thuật diễn giải trừu tƣợng, đƣơng nhiên thỏa mãn. Tính ƣu việt của kỹ thuật này là độ phức tạp của nhỏ hơn rất nhiều tùy theo quá trình trừu tƣợng hóa (ánh xạ trừu tƣợng hóa từ vào ) nhƣ thế nào. Trong thực tế, kỹ thuật diễn giải trừu tƣợng có một thành phần là bộ sinh (generator) ngữ nghĩa trừu tƣợng đọc mã nguồn chƣơng trình và tạo ra các ràng buộc hoặc hệ các phƣơng trình cần đƣợc giải bởi máy tính thông qua một thành phần khác là bộ giải (solver).

Một phƣơng pháp phổ biến là dùng hàm lặp khi giải. Việc tìm nghiệm thông qua hàm lặp có hạn chế về mặt thời gian (phƣơng pháp không hội tụ sau vô hạn lần lặp). Các kỹ thuật liên quan tới việc tăng tốc hội tụ cũng đƣợc nghiên cứu. Thứ ba, nhóm kỹ thuật liên quan tới mô hình đƣợc gọi là kỹ thuật kiểm chứng mô hình (Model checking) [5].

Kiểm chứng mô hình là kỹ thuật kiểm tra xem một mô hình của hệ thống có thỏa mãn một tính chất nào đó hay không. Cụ thể hơn, với mô hình và thuộc tính cho trƣớc, kỹ thuật kiểm tra xem thuộc tính có thỏa mãn trong mô hình hay không:. Về mặt thực thi, kiểm chứng mô hình là kỹ thuật tĩnh, nó duyệt qua tất cả các trạng thái, các đƣờng TIEU LUAN MOI download : skknchat@gmail.com 10 thực thi có thể có trong mô hình để xác định tính khả thỏa của. Nếu một hệ thống không thoả mãn một tính chất thì kiểm chứng mô hình sẽ đƣa ra phản ví dụ với một chuỗi các trạng thái và sự kiện liên quan bắt đầu từ trạng thái ban đầu tới trạng thái lỗi của mô hình.

Những tính chất kiểm tra thƣờng là tính sống (liveness properties), tính an toàn (safety properties) nhƣ khả năng không tồn tại khóa chết (deadlock) hoặc rơi vào những trạng thái nguy hiểm tạo sự cố cho hệ thống. Nhóm kỹ thuật này tập trung vào các hệ thống hữu hạn trạng thái hoặc đƣợc giảm xuống còn hữu hạn trạng thái bởi sự trừu tƣợng hóa (abstraction). Cuối cùng, kỹ thuật phân tích biểu trƣng (symbolic analysis) [14]. Kỹ thuật này là phân tích tĩnh mã nguồn tĩnh, xây dựng các luồng rẽ nhánh trong chƣơng trình dựa trên các nút.

Tại các nút tƣơng ứng sẽ là tập hợp các ràng buộc (constraints) của dữ liệu, biến, tham số. Tại nút khởi tạo chƣơng trình, tập hợp các ràng buộc là rỗng. Càng đi sâu xuống các nhánh nhỏ, tại các nút con, tập hợp ràng buộc sẽ đƣợc tạo ra từ tập hợp ràng buộc tại nút ngay phía trên cộng với điều kiện giữa các biến số để có thể rẽ từ nút trên vào nút dƣới trong luồng chảy chƣơng trình. Điểm đặc biệt của kỹ thuật này là các tham số hoàn toàn đƣợc thể hiện bằng ký tự biểu trƣng, chứ không phải giá trị cụ thể.

Ý tƣởng của phƣơng pháp này là để kiểm thử một nhánh trong chƣơng trình, điều kiện tiên quyết là dữ liệu tại đầu vào phải thỏa mãn tập hợp các ràng buộc tại nút bắt đầu nhánh đó. Việc giải các ràng buộc gắn với một nút đƣợc thực hiện bởi các bộ công cụ sẵn có gọi là giải ràng buộc (constraint solver) dựa trên SMT (Satisfiability Modulo Theories) hay SAT (Satisfiability Testing). Hai nhóm đầu tập trung vào việc nâng cao chất lƣợng phần mềm tại mức mã nguồn, trong khi hai nhóm sau xử lý phần mềm tại mức trừu tƣợng cao hơn – mô hình. Với tình hình nghiên cứu cơ bản và xu thế công nghệ phần mềm trên thế giới hiện nay tập trung vào các vấn đề lớn nhƣ quy mô và chất lƣợng của các sản phẩm phần mềm, bài toán quản lý bộ nhớ heap là một trong những bài toán phổ biến đặc trƣng trong đảm bảo chất lƣợng phần mềm.

Việc tiến hành nghiên cứu trong lĩnh vực này là cần thiết trong việc nâng cao chất lƣợng nghiên cứu ứng dụng vào thực tế kiểm soát chất lƣợng phần. Do đó, luận văn sẽ tập trung vào nhóm các kỹ thuật liên quan để giải quyết bài toán trên. TIEU LUAN MOI download : skknchat@gmail.com 11 CHƢƠNG 2. LÝ THUYẾT NỀN TẢNG 2.

Nền tảng phân tích ngữ nghĩa của chƣơng trình 2.

Nội dung được bảo vệ bản quyền — Tải xuống đầy đủ