Heap cụ thể

Một phần của tài liệu ỨNG DỤNG KỸ THUẬT DIỄN GIẢI TRỪU TƯỢNG TRONG PHÂN TÍCH BỘ NHỚ HEAP (Trang 38)

Việc phân tích chương trình bắt đầu từ ngữ nghĩa cụ thể. Cấu trúc 2 – valued logic được sử dụng để biểu diễn khối bộ nhớ được sử dụng trong ngữ nghĩa thực

thi của chương trình. Một cấu trúc 2 – valued logic là một bộ ( , ) trong đó

là tập các phần tử được gọi là individual (các nút) và là tập các vị từ trên

. Một vị từ trên được kí hiệu là . Với mỗi vị từ có số chiều , là hàm: ( ) → {0, 1}.

Một heap cụ thể của chương trình được mô tả bằng cấu trúc 2 – valued logic:

Với là tập các nút trên đồ thị heap, tức là tập các khối bộ nhớ được cấp phát.

Các vị từ biểu diễn quan hệ tham chiếu trong heap. Vị từ đơn nguyên (Unary

predicates) có thể biểu diễn quan hệ tham chiếu giữa một biến chương trình với

một nút của heap: Nếu biến tham chiếu tới nút 1, chúng ta tạo một vị từ đơn nguyên mà ( 1) = 1. Vị từ nhị nguyên (Binary predicates) được dùng để biểu diễn tham chiếu giữa các nút (định nghĩa các cạnh giữa các nút trong đồ thị heap). Do đó thông tin về heap được thể hiện thông qua việc đánh giá các vị từ liên quan.

Ví dụ: Hình 3.1. minh họa việc sử dụng một cấu trúc 2 – valued logic để

biểu diễn một heap gồm 3 nút. Thấy rằng vị từ đơn nguyên thỏa mãn đối với 1, tức là ( 1) = 1, và 1 có trỏ tới 2 biểu diễn với vị từ nhị nguyên , tức là ( 1, 2) = 1. Tương tự ( 2, 3) = 1.

Hình 3.1.Biểu diễn heap cụ thể 3.1.2. Trừu tượng hóa heap

Khi đó, xem xét sự tương đương trong một vài bối cảnh, một số nút của heap cụ thể có thể được kết hợp vào trong một nút trong heap trừu tượng, nút này

được gọi là nút tóm tắt (summary node). Một cấu trúc 3 – valued logic được đưa

ra có thể biểu diễn nhiều vô hạn các nút cụ thể. Việc quyết định khi áp dụng tóm

tắt nhiều nút cụ thể thành một nút dựa trên lý thuyết Canonical abstraction: tất

cả các nút cùng thống nhất giá trị đối với tập các vị từ trừu tượng cấp một được xem là tương đương và do đó được ánh xạ qua cùng một nút trong cấu trúc trừu tượng đầu ra.

Cấu trúc3 – valued logic của Kleene được sử dụng mô tả heap trừu tượng, mở rộng từ 2 – valued logic thông thường bởi việc đưa thêm giá trị . 3 – valued

logic chỉ khác 2 – valued logicở hàm vị từ: ( ) → {0, 1,1/2}. Giá trị 0 và 1 được gọi là các giá trị xác định, giá trị ½ được gọi là giá trị không xác định. Cấu

2 – valued logic nhưng cạnh ứng với giá trị ½ được vẽ bằng nét đứt [16][11][10].

Các toán tử mệnh đề được thể hiện trong hình 3.2. Một quan hệ thứ tự từng phần ⊑ trên tập các giá trị phản ánh thông tin: ⊑ thể hiện rằng có nhiều thông tin xác định hơn .

∧ 0 1 1/2 ∨ 0 1 1/2 ¬

0 0 0 0 0 0 1 1/2 0 1

1 0 1 1/2 1 1 1 1 1 0

1/2 0 1/2 1/2 1/2 1/2 1 1/2 1/2 1/2

Hình 3.2.Các toán tử logic

Định nghĩa 3.3.1. Cho , ∈ {0, , 1}, định nghĩa thứ tự trên tập giá trị như sau: ⊑ nếu = hoặc = 1/2. Kí hiệu ⊔ ( ) biểu diễn cận trên nhỏ nhất theo quan hệ ⊑, tức là ⊔ nếu = và nếu ngược lại.

Ngữ nghĩa của 3 – valued logic là đơn điệu theo quan hệ thứ tự trên.

Hình 3.3 thể hiện cùng cấu trúc 2 –valued logic trong ví dụ trước, nhưng sau

khi đã được trừu tượng hóa (với là vị từ trừu tượng). Do ( 2) = ( 3) = 0 trong cấu trúc trước nên 2 và 3 được tóm tắt vào cùng một nút trong cấu

trúc 3 – valued logic.

Hình 3.3.Trừu tượng hóa heap

Sau khi đã trừu tượng hóa ngữ nghĩa cụ thể lên thành ngữ nghĩa trừu tượng. Mọi việc phân tích, tính toán đều thực hiện trên ngữ nghĩa trừu tượng này. Từ đặc tả heap trừu tượng đầu vào biểu diễn bởi cấu trúc 3 – valued logic và các thực thi được biểu diễn bằng công thức logic vị từ cấp một. Một hệ phương trình

x

n1 f n2

ràng buộc sẽ được tạo ra từ các đặc tả này. Thuật toán lặp Focus và Coerce[16]

sẽ giải các ràng buộc và tìm điểm cố định nhỏ nhất của hệ phương trình. Nghiệm này chính là biểu diễn trừu tượng của các trạng thái heap có thể có trong quá trình thực thi.

Năm 2000, dựa vào cách tiếp cận phân tích hình dạng heap như trên T.Lev- Ami đã cài đặt các ý tưởng đó thành công cụ gọi là TVLA.Làm cho việc phân tích hình dạng heap trở nên dễ dàng hơn.

3.2. Thực nghiệm

3.2.1. Giới thiệu TVLA

TVLA (Three - Valued Logic Analysis Engine) là một công cụ mã nguồn mở

được phát triển bởi Lev-Ami nhằm phục vụ mục tiêu nghiên cứu, phát triển lý thuyết diễn giải trừu tượng. TVLA có:

 Hỗ trợ ngôn ngữ đặc tả để biểu diễn ngữ nghĩa thực thi của chương trình (thông qua các vị từ và các công thức logic vị từ);

Ngôn ngữ đặc tả trên cũng mô tả đồ thị luồng điều khiển (CFG – Control

Flow Graph) của chương trình;

 Cung cấp cấu trúc 3 – valued mô tả đầu vào của chương trình. Từ những đặc tả này, TVLA xây dựng một hệ phương trình ràng buộc tương ứng, và tìm nghiệm là điểm cố định nhỏ nhất.

TVLA thích hợp để kiểm tra các tính chất liên quan đếnheap của chương trình.

Kỹ thuật phân tích hình dạng dựa trên 3 – valued logicđược giới thiệu bởi

Sagiv[16][16]. Sau đó Lev-Ami cài đặt các ý tưởng trong phương pháp này và tạo ra công cụ TVLA[11][11][11][11].

TVLA thực thi với hai đầu vào: Bắt đầu với ngữ nghĩa cụ thể (Ngữ nghĩa

thực thi – Operation semantic) của một chương trình, ngữ nghĩa thực thi được

đặc tả bằng logic vị từ cấp một với bao đóng bắc cầu. Đầu vào tiếp đó là biểu diễn trừu tượng của tất cả các trạng thái bộ nhớ ở điểm vào của chương trình cần phân tích. TVLA sẽ tự động sinh ra ngữ nghĩa trừu tượng, và với mỗi điểm

chương trình (Program point) sinh ra một diễn giải trừu tượng của các trạng thái

bộ nhớ ở điểm đó.

TVLA được cài đặt bằng Java và đã sử dụng thành công trong việc phân tích hình dạng của các chương trình thao tác với các cấu trúc dữ liệu liên kết (danh

sách móc nối đơn, danh sách móc nối kép), để chứng minh tính an toàn của hệ thống Mobile Ambients, và xác minh tính đúng đắn cục bộ của một số chương trình sắp xếp. Trong phạm vi của luận văn chỉ tập trung vào vấn đề phân tích hình dạng trên TVLA và làm rõ ứng dụng của kỹ thuật diễn giải trừu tượng trong việc phân tích hình dạng.

3.2.2. Đặc tả hệ thống trong TVLA

Chương trình được đặc tả trong TVLA thông qua hai định dạng [10].

TVS (Three Valued logical Structure): Được sử dụng để đặc tả trạng thái của heap đầu vào và heap đầu ra sử dụng cấu trúc 3 – valued logic. Giả

sử có heap như hình 3.2 và hình 3.3 ta có thể biểu diễn trong tệp TVS tương ứng như sau:

//Mô tả heap hình 3.2 //các nút % = { 1, 2, 3} // Các vị từ % = { = { 1} = { 1 → 2, 2 → 3}} //Mô tả heap hình 3.3 % = { 1, 2} % = { = { 1} = { 1 → 2: 1/2, 2 → 2: 1/2} = { 2: 1/2} // 2 à ú ó ắ }

TVP (Three Valued Program) chứa định nghĩa các vị từ, các actions. Từ

đó kết hợp với CFG để đặc tả ngữ nghĩa thực thi của chương trình. Để đơn giản trong đặc tả, ngữ nghĩa thực thi được chỉ định riêng biệt theo từng loại dữ liệu.

Một quan sát quan trọng là đặc tả TVP luôn được nghĩ thông qua các khái

niệm dạng 2 – valued hơn là 3 – valued: lý thuyết Embedding đảm bảo tính

mạnh của việc diễn giải lại công thức trong miền trừu tượng. Đây là ứng dụng của diễn giải trừu tượng trong phân tích tĩnh, theo đó một phân tích tĩnh luôn bắt đầu với ngữ nghĩa thực thi cụ thể trong miền cụ thể của chương trình, sau đó được diễn giải lại thành ngữ nghĩa trừu tượng trên miền trừu tượng.

3.2.3. Biểu diễn ngữ nghĩa và chương trình

Để biểu diễn ngữ nghĩa cụ thể của các lệnh trong chương trình TVLA sử

dụng các actions. Các actions có thể có tham số và sử dụng logic vị từ để mô tả

quá trình chuyển từ một trạng thái tới một trạng thái khác khi lệnh được thực thi. Trong thực tế, tác động trong quá trình chuyển trạng thái được hoàn thành bằng

việc sử dụng một tập các công thức vị từ cập nhật (Predicate – update

formulae). Các vị từ, các công thức logic và các vị từ cập nhật, được cập nhật lại

sau khi chuyển qua trạng thái mới.

Để biểu diễn ngữ nghĩa cụ thể của toàn chương trình, TVLA sử dụng thêm CFG, và các cạnh của CFG được gắn thể hiện của các actions[10].

Ví dụ: Cho heap trừu tượng trong hình 3.3 là trạng thái vào và giả sử chúng ta muốn thiết đặt trường của nút 1 trỏ tới . Trong một ngôn ngữ lập trình điều này có thể được biểu diễn dưới dạng . = . Để biểu diễn quá trình này chúng ta đưa ra một action là ( , ), có thể được sử dụng để thiết đặt một trường của một nút được trỏ bởi một biến trong chương trình tới giá trị . Sau đó chúng ta thể hiện action này với (tương ứng nút 1) và trường dưới dạng tham số. Cuối cùng là gắn thể hiện của action này với và lên cạnh của CFG. Chi tiết được cài đặt theo định dạng TVP trong TVLA như sau.

// Vị từ % ( _1) % ( _1, _2) %% // Các actions % ( , ) { % { ( )} { ( _1, _2) = ( _1, _2) & ! ( _1) } } %% // CFG ( , )

TVLA sẽ tự động sinh ngữ nghĩa trừu tượng từ ngữ nghĩa trừu tượngđầu vào của chương trình (biểu diễn qua các actions bằng logic vị từ) để thực thi. Kết quả tạo ra heap trừu tượng đầu ra được thể hiện trong hình 3.4.

Hình 3.4.Kết quảheap trừu tượng đầu ra

Tập TVS đặc tả heap trừu tượng trên được TVLA xuất ra có nội dung như sau.

% = { 1, 2} % = {

= { 1}

= { 2: 1/2} }

3.2.4. Tinh chỉnh sự trừu tượng hóa

Để tăng độ chính xác của phân tích, các vị từ dẫn xuất (instrumentation) có

thể được thêm vào. Chúng biểu diễn các tính chất mà có sự tham gia của các vị

từ lõi (core predicates) cơ bản. Chúng thường dẫn tới việc tìm sự khác nhau

giữa cấu trúc cụ thể được thể hiện bởiheap trừu tượng và có thể được sử dụng để điều chỉnh các phân tích hình dạng cho các cấu trúc dữ liệu nhất định.

Các nút tóm tắt cũng có thể được chia thành các nút riêng biệt một lần nữa

trong quá trình cụ thể hóa (materialization): Với giá trị 'unknown' (1/2) trong cấu trúc trừu tượng có thể bị đưa ra để xác định giá trị thật sự là ('true'/'false'). Công thức tập trung (Focus formulas) được sử dụng để mô tả các phần của heap

mà cần giả định các giá trị xác định, như ví dụ ta đang xét.

Cuối cùng, các ràng buộc toàn vẹn đảm bảo rằng cấu trúc được trừu tượng

thỏa mãn một số quy tắc (ví dụ như bất biến toàn cục). Đôi khi, một cấu trúc 3 –

valued được tạo ra không thể hiện bất kỳ cấu trúc cụ thể nào và do đó có thể xóa

bỏ.

Ví dụ: Xem xét ví dụ đang xét một lần nữa. Giả sử chúng ta bắt đầu với trạng thái trừu tượng được mô tả trong hình 3.3 và muốn truy cập vào nút mà trước đó nút 1 tham chiếu đến với trường , tức là thực thi = . . Kết quả cấu trúc heap thu được chỉ ra trong hình 3.5.

Hình 3.5.Kết quả truy cập trường f

Trong cấu trúc ở (a) và (b) ta thấy rằng một nút lần nữa được cụ thể hóa ra ngoài nút trừu tượng và giờ nó được chỉ bởi biến . Thông tin là có chính xác bao nhiêu nút trong cấu trúc ban đầu bị mất sau khi trừu tượng. Tuy vậy, điều này không đúng với cấu trúc thứ 3 (c): sự trừu tượng cũng không đảm bảo được thực tế là các nút cụ thể được biểu diễn bởi 2 thực sự tới được từ 1. Vì thế, trường hợp này không phải là trường hợp ta đã xét. Ta có thể cải tiến phân tích và bỏ qua trường hợp này bằng cách thêm vào vị từ dẫn xuất cho tính khả đạt.

3.2.5. Ví dụ minh họa

3.2.5.1. Giới thiệu bài toán

Trong phần thử nghiệm này phân tích thực hiện kiểm tra chương trình thao tác với danh sách liên kết đơn có cấu trúc như sau:

{ ∗ ; ;

} ∗ ;

Mục tiêu là áp dụng các kỹ thuật diễn giải trừu tượng đã trình bày vào phân tích để xác minh các thuộc tính sau:

 Không thất thoát bộ nhớ (không có phần tử nào tồn tại mà không đạt đến được từ biến của chương trình);

 Danh sách đầu ra là không chia sẻ (không có phần tử nào bị tham chiếu tới bởi nhiều hơn một phần tử khác).

Thuộc tính thứ nhất được kiểm tra trong tất cả các ví dụ và hai thuộc tính sauchỉ được kiểm tra với những ví dụ thích hợp (các thao tác biến đổi danh sách: tạo mới, thêm mới, xóa, đảo ngược, kết hợp).

Cụ thể trong luận văn này, tôi thực hiện với thao tác Create(), hàm này tạo

mới một danh sách liên kết đơn có cấu trúc như trên, và gắn nó vào một danh sách liên kết đơn đang được trỏ bởi x. Sau đó thực hiện xác minh hai thuộc tính "Không thất thoát bộ nhớ" và thuộc tính "Danh sách đầu ra không chia sẻ".

Để đơn giản hóa phân tích trong TVLA, các hàm C nguyên bản được tiền xử lý bằng phương pháp sau:

 Lệnh gán với một trường dữ liệu được thực hiện trung gian qua lệnh gán trường đó bằng giá trị trước. Ví dụ → = ; được thay thế bởi → = ; → = ;

 Các lệnh giải phóng bộ nhớ cũng được thực hiện qua lệnh gán

trung gian với các trường giá trị. Ví dụ, ( ); được thay thế bằng −> = ; ( );

 Các lệnh sao chép giá trị từ một trường đến một trường khác được đơn giản bởi việc sử dụng biến trung gian. Ví dụ, → = → được thay thế bởi = → ; → = ; → = ; = .

Các điều kiện rẽ nhánh trong chương trình được mô hình bởi hai action, một cho nhánh true và một cho nhánh false.

3.2.5.2. Đặc tả dữ liệu đầu vào

Tệp TVS mô tả heap đầu vào

Tệp tin TVS (input.tvs) mô tả các đồ thị hình dạng có thể có củaheap đầu

vào, bao gồm:

 Một danh sách liên kết đơn có nhiều hơn 2 phần tử được trỏ tới bởi biến x.

 Một danh sách liên kết đơn có 1 phần tử được trỏ tới bởi biến x.

Cụ thể tệp có nội dung như ở Phụ lục A. Tệp TVP định nghĩa các vị từ

Tệp tin TVP (predicates.tvp) mô tả các vị từ được sử dụng,bao gồm:

 Vị từ đơn nguyên: ℎ ( ) {% ( ) } với mỗi biến tạo ra một vị từ đơn nguyên. Từ khóa unique dùng để chỉ vị từ thỏa mãn ít nhất một phần tử.

 Vịtừ nhị nguyên: % ( _1, _2) biểu diễn trường n của danh sách liên kết.

 Các vị từ được suy ra từ vị từ đơn nguyên và vị từ nhị nguyên:

- Vị từ [ ] thỏa mãn với các phần tử được trỏ tới bởi hai phần tử khác.

- Vị từ [ ] biểu diễn tính tới được theo phản xạ bắc cầugiữa các phần tử thông qua trường .

- Với mỗi biến chương trình , vị từ [ , ] thỏa mãn đối với các phần tử khi là tới được từ thông qua trường con trỏ . Cụ thể tệp có nội dung như ở Phụ lục B.

Tệp TVP định nghĩa các Actions

Tệp tin TVP (actions.tvp) mô tả các actions được sử dụng, bao gồm:

 Các thao tác con trỏ:

- Thao tác phân bổ vùng nhớ heap : % _ ( ℎ ) tức là

khởi tạo một vùng nhớ cho con trỏ lhs.

- Thao tác gán 2 biến con trỏ: % _ _ ( ℎ , ℎ ) tức

là con trỏ lhs trỏ đến vùng nhớ mà con trỏ rhs đang trỏ tới.

- Thao tác thiết lập trường con trỏ trỏ đến vùng nhớ Null : % _ _ _ ( ℎ ) tức là thiết lập cho ℎ → =

.

- Thao tác thiết lập trường con trỏ trỏ đến vùng nhớ con trỏ khác: % _ _ ( ℎ , ℎ ) tức là con trỏ lhs trỏ tới vùng nhớ

con trỏ rhs.

 Các thao tác cho việc kiểm tra các thuộc tính:

Một phần của tài liệu ỨNG DỤNG KỸ THUẬT DIỄN GIẢI TRỪU TƯỢNG TRONG PHÂN TÍCH BỘ NHỚ HEAP (Trang 38)

Tải bản đầy đủ (PDF)

(70 trang)