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

Nghiên cứu kỹ thuật giải thích trừu tượng

90 390 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 90
Dung lượng 1,73 MB

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

Nội dung

6 DANH MỤC CÁC THUẬT NGỮ VÀ CHỮ VIẾT TẮT 2 Abstract semantics Ngữ nghĩa trừu tượng 4 Concrete semantics Ngữ nghĩa cụ thể 5 Continue - con Tính liên tục của một hàm số 6 Control Flow Grap

Trang 1

ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

-

NGUYỄN THANH LIÊM

NGHIÊN CỨU

KỸ THUẬT GIẢI THÍCH TRỪU TƯỢNG

LUẬN VĂN THẠC SĨ KHOA HỌC

Hà Nội – Năm 2014

Trang 2

ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

-

NGUYỄN THANH LIÊM

NGHIÊN CỨU

KỸ THUẬT GIẢI THÍCH TRỪU TƯỢNG

Chuyên ngành: CƠ SỞ TOÁN HỌC CHO TIN HỌC

Mã số: 60460110

LUẬN VĂN THẠC SĨ KHOA HỌC

NGƯỜI HƯỚNG DẪN KHOA HỌC

TS NGUYỄN TRƯỜNG THẮNG

Hà Nội – Năm 2014

Trang 3

1

LỜI CAM ĐOAN Tôi xin cam đoan đây là công trình nghiên cứu của tôi trong đó có sự giúp đỡ của giáo viên hướng dẫn TS Nguyễn Trường Thắ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 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, được tham khảo theo các tài liệu của các tác giả do giáo viên hướng dẫn cung cấp

và được liệt kê tại mục tài liệu tham khảo

Học viên

Nguyễn Thanh Liêm

Trang 4

2

LỜI CẢM ƠN Lời đầu tiên tôi xin gửi lời cảm ơn chân thành và bày tỏ lòng biết ơn sâu sắc nhất tới giáo viên hướng dẫn 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 đã hướng dẫn tận tình, giúp đỡ và truyền đạt cho những kiến thức, kinh nghiệm quí báu trong suốt thời gian vừa qua, thầy đã cung cấp cho tôi các tài liệu rất hữu ích để hoàn thành luận văn này

Tôi cũng xin gửi lời cảm ơn chân thành tới tất cả các thầy, cô trong bộ môn Tin học - Khoa Toán - Cơ - Tin học - Trường Đại học Khoa học Tự nhiên - ĐHQG Hà Nội đã giúp đỡ tôi về kiến thức, tinh thần và những lời khuyên quí báu trong suốt quá trình học tập vừa qua

Cảm ơn đến tất cả các bạn bè, đồng nghiệp trong Viện Công nghệ thông tin - Viện Hàn lâm Khoa học và Công nghệ Việt Nam, trường Đại học Hải Dương đã cung cấp cho tôi những tài liệu quí báu, giúp đỡ, động viên và tạo điều kiện cho tôi về tất cả mọi mặt trong suốt một năm qua

Cuối cùng tôi xin gửi lời cảm ơn tới các thành viên trong gia đình đã tạo điều kiện tốt nhất cho tôi, động viên, cổ vũ tôi trong quá trình học tập và nghiên cứu để tôi hoàn thành luận văn này

Học viên

Nguyễn Thanh Liêm

Trang 5

3

MỤC LỤC

LỜI CAM ĐOAN 1

LỜI CẢM ƠN 2

MỤC LỤC 3

DANH MỤC CÁC THUẬT NGỮ VÀ CHỮ VIẾT TẮT 6

DANH MỤC CÁC HÌNH VẼ 7

MỞ ĐẦU 8

Chương 1 - TỔNG QUAN 10

1.1 Tổng quan về phân tích chương trình 10

1.1.1 Ý tưởng của bài toán phân tích chương trình 11

1.1.2 Phân tích chương trình tĩnh 12

1.2 Tổng quan về kỹ thuật giải thích trừu tượng 13

1.3 Tổng quan về tình hình nghiên cứu 15

1.4 Kết luận chương 1 16

Chương 2 - CỞ SỞ LÝ THUYẾT CỦA KỸ THUẬT GIẢI THÍCH TRỪU TƯỢNG 17

2.1 Khái niệm về kỹ thuật giải thích trừu tượng 17

2.2 Ứng dụng của kỹ thuật giải thích trừu tượng 17

2.3 Một số khái niệm cơ bản 18

2.3.1 Ngữ nghĩa cụ thể của chương trình 18

2.3.2 Thuộc tính an toàn của chương trình 19

2.3.3 Miền trừu tượng 20

2.3.4 Độ phủ của kỹ thuật giải thích trừu tượng 21

2.3.5 Các phương pháp hình thức 22

2.3.6 Tính chất cần thiết của ngữ nghĩa trừu tượng 23

2.4 Lý thuyết dàn 25

Trang 6

4

2.5 Lý thuyết điểm cố định 28

2.5.1 Điểm cố định 28

2.5.2 Mở rộng ký hiệu điểm cố định 29

2.5.3 Bước lặp 29

2.5.4 Đồ thị luồng điều khiển (Control Flow Graphs - CFG) 33

2.5.5 Phân tích luồng dữ liệu (Data Flow Analysis) 36

2.5.6 Thuật toán tìm điểm cố định 36

2.6 Tiếp cận kết nối Galois cho kỹ thuật giải thích trừu tượng 38

2.6.1 Kết nối Galois 38

2.6.2 Tính đủ và tính chính xác (Soundness and Precision) 39

2.6.3 Mở rộng tới không gian hàm (Extension to Function Spaces) 40

2.6.4 Trừu tượng hàm (Functional Abstraction) 41

2.7 Trừu tượng hóa ngữ nghĩa chương trình 41

2.7.1 Hệ dịch chuyển 41

2.7.2 Ngữ nghĩa vết (Trace semantics) 43

2.7.3 Biểu diễn ngữ nghĩa vết dưới dạng điểm cố định 44

2.7.4 Bao đóng phản xạ bắc cầu (RTC - reflexive transitive closure) là trừu tượng hóa của ngữ nghĩa vết 45

2.7.5 Thỏa mãn kết nối Galois 45

2.7.6 Biểu diễn ngữ nghĩa RTC dưới dạng điểm cố định 46

2.7.7 Ngữ nghĩa tới được là trừu tượng hoá của ngữ nghĩa RTC 47

2.7.8 Biểu diễn ngữ nghĩa tới được dưới dạng điểm cố định 47

2.8 Kết luận chương 2 48

Chương 3 - THỰC NGHIỆM 49

3.1 Giới thiệu về TVLA 49

3.2 Phân tích trong TVLA 50

Trang 7

5

3.2.1 Cấu trúc 3-valued Logic 51

3.2.2 Biểu diễn trạng thái bộ nhớ Heap qua cấu trúc Logic 52

3.2.3 Trừu tượng heap 53

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

3.2.5 Ví dụ về phân tích chương trình 57

3.3 Thuật toán sinh hệ ràng buộc Coerce và thuật toán giải hệ ràng buộc tìm điểm cố định Focus 59

3.3.1 Công thức 59

3.3.2 Các lớp con của công thức 60

3.3.3 Ngữ nghĩa 60

3.3.4 Focus 61

3.3.5 Công thức cập nhật 63

3.3.6 Thuật toán Coerce xác định hệ ràng buộc 65

3.3.7 Thuật toán Focus giải hệ ràng buộc 67

3.4 Thử nghiệm 70

3.4.1 Đặc tả hệ thống trong TVLA 70

3.4.2 Giới thiệu bài toán 71

3.4.3 Đặc tả dữ liệu đầu vào 71

3.4.4 Kết quả phân tích 76

3.5 Kết luận chương 3 77

KẾT LUẬN 78

TÀI LIỆU THAM KHẢO 79

PHỤ LỤC A: 81

PHỤ LỤC B: 83

Trang 8

6

DANH MỤC CÁC THUẬT NGỮ VÀ CHỮ VIẾT TẮT

2 Abstract semantics Ngữ nghĩa trừu tượng

4 Concrete semantics Ngữ nghĩa cụ thể

5 Continue - con Tính liên tục của một hàm số

6 Control Flow Graphs - CFG Đồ thị luồng điều khiển

7 Data Flow Analysis - DFA Phân tích luồng dữ liệu

9 Fixpoint approximation Xấp xỉ điểm cố định

10 Galois connections Kết nối Galois

11 Interval semantics Ngữ nghĩa khoảng

12 Lattice

Dàn - Tập hợp các phần tử có thứ

tự từng phần có điểm chặn dưới lớn nhất và trặn trên nhỏ nhất

15 Partial Ordered Set - Poset Tập hợp các phần tử có thứ tự

17 Reachability semantics Ngữ nghĩa tới được

18 Reflexive transitive closure - RTC Bao đóng phản xạ bắc cầu

19 Reflexive transitive closure

semantics - RTCs

Ngữ nghĩa bao đóng phản xạ bắc cầu

21 Trace semantics

Ngữ nghĩa vết, Tập hợp các dấu vết về quá trình chuyển đổi trạng thái của chương trình

Trang 9

7

DANH MỤC CÁC HÌNH VẼ

TT Hình ảnh sử dụng Trang

1 Hình 1.1: Bài toán phân tích chương trình tổng quát 12

2 Hình 1.2: Trừu tượng hóa theo điểm cố định 14

3 Hình 1.3: Các thành phần chính của phân tích chương trình 14

4 Hình 2.1 Sơ đồ hành vi có thể của chương trình 18

5 Hình 2.2: Quĩ đạo an toàn của các thực thi 19

6 Hình 2.3: Quĩ đạo không an toàn đối với kiểm thử/gỡ lỗi 20

7 Hình 2.4: Biểu diễn miền trừu tượng 21

8 Hình 2.5: Trừu tượng hóa quĩ đạo hành vi của chương trình 22

9 Hình 2.6: Trừu tượng hóa quĩ đạo hành vi không đảm bảo tính đủ 24

10 Hình 2.7: Lỗi trừu tượng hóa quĩ đạo hành vi không chính xác 24

11 Hình 2.8: Tiêu chuẩn trừu tượng hóa theo khoảng 25

12 Hình 2.9: Biểu đồ Hasse của dàn (2A,⊆) 26

13 Hình 2.10: Biểu diễn ngữ nghĩa của một chương trình thành dàn 28

14 Hình 2.11: Biểu diễn điểm cố định của hàm cosx = x 30

15 Hình 2.12: Tính toán điểm cố định trên dàn 30

16 Hình 2.13: Phép cộng dàn 32

17 Hình 2.14: Phép nâng dàn 31

18 Hình 2.15: Dàn phẳng 32

19 Hình 2.16: CFG cho các lệnh đơn giản 34

20 Hình 2.17: CFG cho cấu trúc tuần tự 34

21 Hình 2.18: CFG cho cấu trúc rẽ nhánh 34

22 Hình 2.19: CFG cho cấu trúc lặp 35

23 Hình 2.20: CFG của hàm tính n! 35

24 Hình 2.21: ¯F(¯x) là một xấp xỉ của F(x) 41

25 Hình 2.22: Biểu diễn quan hệ chuyển tiếp ngữ nghĩa chương trình 42

26 Hình 2.23: Hệ chuyển dịch quĩ đạo thực thực thi của chương trình 42

27 Hình 2.24: Biểu diễn ngữ nghĩa vết thực thi 43

28 Hình 2.25: Biểu diễn ngữ nghĩa vết dưới dạng điểm cố định 44

29 Hình 2.26: Trừu tượng hóa đến ngữ nghĩa tới được 48

30 Hình 3.1: Các toán tử 3-valued logic của Kleene 52

31 Hình 3.2: Biểu diễn heap cụ thể 53

32 Hình 3.3: Trừu tượng hóa heap 55

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

34 Hình 3.5: Trạng thái của chương trình sử dụng cấu trúc 2-valued logic 58

35 Hình 3.6: Trạng thái của chương trình sử dụng 3-valued logic 58

36 Hình 3.7: Biểu diễn quá trình làm việc của phân tích chương trình 59

37 Hình 3.8: Ứng dụng của giải thích trừu tượng cho phân tích lệnh 62

38 Hình 3.9: Kết quả phân tích hàm tạo danh sách liên kết 77

Trang 10

8

MỞ ĐẦU Ngày nay, các hệ thống phần mềm được sử dụng một cách phổ biến trên tất cả các lĩnh vực của đời sống, trong sản xuất, kinh doanh như: kinh tế, tài chính, kế toán, y tế, giáo dục, chính phủ,… , và trong các thiết bị điện tử công nghiệp và dân dụng, nó được phát triển trở lên ngày càng phức tạp Sự phức tạp này còn lớn hơn đối với các hệ thống điều khiển và các hệ thống nhúng trong các thiết bị công nghiệp, hàng không, vũ trụ, … Đối với những đơn vị, cá nhân và các tổ chức làm phần mềm chuyên nghiệp họ đều hiểu rằng một sản phẩm phần mềm được họ tạo ra không thể nào chạy một cách hoàn hảo ngay từ lúc đầu tiên mà không mắc bất kỳ một lỗi gì Trong quá trình phát triển và đưa vào sử dụng một phần mềm bất kỳ, thì hầu hết tất cả các lỗi chỉ được phát hiện sau khi phần mềm đó được đưa vào sử dụng Do vậy, các hoạt động kiểm thử đóng góp một vai trò rất quan trọng nhằm đảm bảo chất lượng của các hệ thống phần mềm

Các hoạt động kiểm thử này luôn được các nhà phát triển phần mềm tính đến trong suốt quá trình phát triển cho một hệ thống phần mềm Tuy nhiên, các hoạt động kiểm thử thường có chi phí rất cao, nó chiếm đến 40% toàn bộ chi phí phát triển phần mềm, còn về mặt thời gian thì đôi khi nó còn nhiều hơn cả việc xây dựng hệ thống Hầu hết các hoạt động kiểm thử nhằm mục đích phân tích các thành phần và cấu trúc của phần mềm để xác định số lượng lớn nhất các lỗi trong tiến trình phát triển: từ đặc tả cho đến mã hóa

Đối với các hệ thống phần mềm phức tạp, cách giải quyết đưa ra ban đầu với các hệ thống bao giờ cũng là cẩn thận trong từng khâu: phân tích, thiết kế, lập trình, kiểm thử để giảm thiểu một cách tối đa các lỗi phát sinh Các nguồn lực cần thiết cho hoạt động kiểm thử là rất quan trọng Vì vậy, việc nghiên cứu các phương pháp nhằm mục đích giảm chi phí trong quá trình kiểm thử đã được đưa ra, nhưng vẫn đảm bảo mục tiêu về tính hiệu quả của phần mềm là một biện pháp hữu hiệu

Trang 11

9

Do vậy, trong luận văn này tôi giới thiệu một phương pháp trong lĩnh

vực phân tích chương trình tĩnh Cụ thể là nghiên cứu về kỹ thuật giải thích

trừu tượng, mục tiêu chính là cập nhật các xu hướng mới của kỹ thuật này ở

trên thế giới để nâng cao chất lượng phần mềm

Các đề tài nghiên cứu về kỹ thuật giải thích trừu tượng chưa được phổ

biến ở trong nước, do vậy trong khuôn khổ của đề tài tôi xin trình bày các

khái niệm cơ bản, cơ sở lý thuyết ban đầu dựa trên các báo cáo tại các hội

nghị thường niên VMCAI (Verification, Model Checking, and Abstract

Interpretation) và các tài liệu nghiên cứu, bài giảng của tác giả Patrick Cousot

trong những năm gần đây

Ứng dụng thử nghiệm tập trung vào công cụ mã nguồn mở TVLA (3 –

Valued Logic Analysis Engine) được phát triển bởi Lev-Ami trường Đại học

Khoa học Máy tính Tel Aviv – Israel

Bố cục của luận văn gồm 3 chương:

Chương 1 - TỔNG QUAN: Tập trung vào các khái niệm liên quan đến

kiểm chứng phần mềm, phân tích chương trình tĩnh, tiếp cận lý thuyết của kỹ

thuật giải thích trừu tượng trong phân tích chương trình tĩnh, tình hình nghiên

cứu ở trong và ngoài nước

Chương 2 - CƠ SỞ LÝ THUYẾT CỦA KỸ THUẬT GIẢI THÍCH

TRỪU TƯỢNG: Tập trung vào cơ sở lý thuyết toán học của kỹ thuật giải

thích trừu tượng, các phương pháp trừu tượng hóa ngữ nghĩa chương

trình, biểu diễn ngữ nghĩa của chương trình thông qua các kỹ thuật trừu

tượng, …, và ứng dụng trong kỹ thuật giải thích trừu tượng

Chương 3 - THỬ NGHIỆM: Tập trung vào việc cài đặt phương pháp

phân tích chương trình tĩnh bằng kỹ thuật giải thích trừu tượng dựa trên bộ

công cụ mã nguồn mở TVLA, làm rõ các ứng dụng trong phân tích hình dạng

KẾT LUẬN: Trình bày nội dung nghiên cứu đã đạt được, các hạn chế

trong quá trình nghiên cứu và định hướng nghiên cứ tiếp theo

Trang 12

10

Chương 1 - TỔNG QUAN 1.1 Tổng quan về phân tích chương trình

Sự phát triển vượt bậc, nhanh chóng của các thiết bị phần cứng với một hệ số 106 lần trong gần 40 năm qua đã dẫn đến sự bùng nổ của kích cỡ các chương trình phần mềm cũng theo một tỉ lệ tương tự chạy trên chúng

Về Qui mô và phạm vi của các chương trình ứng dụng cực lớn này (từ 1 tới

40 triệu dòng mã lệnh) có thể vẫn tiếp tục mở rộng nhanh chóng trong thập

kỉ tới Các chương trình cực lớn như vậy sẽ phải được thiết kế với chi phí hợp lý, theo sau đó vẫn phải sửa chữa, bảo trì và nâng cấp trong suốt dòng đời của chúng (thông thường là khoảng trên 20 năm) Trên thực tế là số lượng và hiệu quả của các đội lập trình, phụ trách việc bảo trì, theo dõi chúng không thể phát triển theo tỷ lệ tương tự như vậy Trong điều kiện như vậy, một tỉ lệ không quá hiếm gặp với 1 lỗi trong 1000 dòng mã lệnh đối với những chương trình cực lớn này thường là quá lạc quan và sẽ không thể nhanh chóng đạt được trong một tương lai gần (hầu như không thể kiểm soát được), đặc biệt đối với những hệ thống quan trọng đòi hỏi độ

an toàn cao Vì vậy trong khoảng 10 năm tới, vấn đề về độ tin cậy của phần mềm (software reliability) có một khả năng sẽ trở thành là một mối quan tâm rất lớn và cũng là một thách thức rất lớn đối với một xã hội hiện đại phụ thuộc rất nhiều vào máy tính [7]

Trong hơn 3 thập kỷ qua, rất nhiều tiến bộ đã được thực hiện cả về mặt

tư duy/công cụ hỗ trợ (để nâng cao khả năng về trí tuệ của con người) để ứng phó với các hệ thống phần mềm phức tạp giúp cho các lập trình viên suy luận tốt hơn về chương trình [7]

Rất nhiều các kỹ thuật kiểm chứng phần mềm (software verification) và các công cụ hỗ trợ kèm theo đã được phát triển, bắt đầu bằng các thực hiện/

mô phỏng chương trình trong nhiều môi trường khác nhau có thể Tuy nhiên,

gỡ lỗi mã biên dịch hoặc mô hình mô phỏng của mã nguồn chương trình là

Trang 13

11

hầu như không thể mở rộng về qui mô và thường chỉ đưa ra được một phạm

vi bao phủ thấp các hành vi động của chương trình Các phương pháp hình thức (formal methods) trong kiểm chứng chương trình (program verification)

đã rất lỗ lực trong việc chứng minh một cách tự động rằng chương trình sẽ thực hiện là chính xác trong tất cả các môi trường đặc tả Lĩnh vực nghiên cứu này bao gồm các phương pháp suy diễn (diductive methods), kiểm chứng mô hình (model checking), định kiểu chương trình (program typing) và phân tích chương trình tĩnh (static program analysis) [7]

Khi bài toán kiểm chứng chương trình đã được chứng minh là không giải được Vì vậy, việc hỗ trợ tính toán cho tất cả các phương pháp kiểm chứng là không hoàn chỉnh (incomplete) Độ phức tạp tính toán hoặc tính không giải được này sẽ được giải quyết bằng cách sử dụng một số hình thức xấp xỉ với mục đích là đưa chúng về bài toán giải được hoặc làm giảm độ phức tạp tính toán trong quá trình kiểm chứng chương trình [7]

1.1.1 Ý tưởng của bài toán phân tích chương trình

Bài toán phân tích chương trình tĩnh có thể được mô tả như sau: Cho trước một chương trình và một đặc tả , phân tích chương trình sẽ kiểm tra

xem ngữ nghĩa của chương trình L có thỏa mãn đặc S hay không (minh họa

hình 1.1) Trong trường hợp xảy ra lỗi, quá trình phân tích sẽ cung cấp các gợi

ý để tìm hiểu nguồn gốc của lỗi (bằng cách phân tích ngược lại sẽ cung cấp các điều kiện cần thiết cho đặc tả thông qua phản ví dụ) [7]

Ví dụ 1.1: Cho đoạn chương trình cần phân tích như sau:

Trang 14

+ Chương trình hiện tại có dừng hay không?

+ Độ lớn của vùng nhớ (heap) là bao nhiêu trong quá trình thực thi? + Đầu ra có thể của nó là gì?

Các câu hỏi khác liên quan đến các điểm chương trình riêng lẻ trong

mã nguồn cũng được đưa ra:

+ Biến x luôn luôn có giá trị như nhau hay không?

+ Giá trị của x sẽ được đọc trong tương lai hay không?

+ Có thể con trỏ p là null không?

+ Các biến p có thể trỏ đến vùng nhớ nào?

+ Biến x có được khởi tạo trước khi nó được đọc hay không?

+ Giá trị của biến số nguyên x là luôn dương?

Trang 15

1.2 Tổng quan về kỹ thuật giải thích trừu tượng

Nguyên tắc của kỹ thuật giải thích trừu tượng (abstract interpretation)

là dựa trên tính toán xấp xỉ ngữ nghĩa của chương trình nhằm mục đích kiểm tra sự thỏa mãn một đặc tả nhất định Kỹ thuật này được sử dụng để suy ra từ một ngữ nghĩa chuẩn (standard semantics) trên miền cụ thể (concrete domain) được một ngữ nghĩa trừu tượng (abstract semantics), ngữ nghĩa này đã được xấp xỉ và tính toán được (approximate and computable abstract semantics) trên miền trừu tượng (abstract domain) theo hình minh họa 1.2 [7]

Tuy nhiên với quá trình suy dẫn này, bản thân nó 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 hàm 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ừ L) không thỏa mãn đặc tả S, khi đó ta không kết luận ngay là chương trình L không thỏa mãn đặc tả S do tính không hoàn chỉnh (incompleteness) của kỹ thuật giải thích trừu tượng của L, mà

trước hết phải tinh chỉnh lại hàm sao cho phù hợp

Nếu S thỏa mãn bởi , do tính đúng đắn của kỹ thuật giải thích trừu tượng suy ra S thỏa mãn L Ưu điểm lớn nhất của kỹ thuật này là độ phức tạp tính toán trên nhỏ hơn rất nhiều so với L tùy theo quá trình trừu tượng hóa (hàm trừu tượng hóa từ L vào ), được minh họa trong hình 1.2:

Trang 16

14

Hình 1.2: Trừu tượng hóa theo điểm cố định ⊑ ( #) Trong thực tế, việc phân tích chương trình tĩnh bằng kỹ thuật giải thích trừu tượng có chứa một thành phần là bộ sinh (generator) ngữ nghĩa trừu tượng thông qua việc đọc mã nguồn chương trình và tạo ra các hệ phương trình điểm cố định hoặc hệ phương trình ràng buộc cần giải bởi máy tính, thành phần tiếp theo của kỹ thuật này là bộ giải (solver) được sử dụng để giải các hệ phương trình điểm cố định/hệ phương trình ràng buộc Các thành phần chính của kỹ thuật này được mô tả trong hình 1.3 [7]

Hình 1.3: Các thành phần chính của phân tích chương trình

Trang 17

15

Khi tìm được nghiệm xấp xỉ của hệ, một phương pháp phổ biến là dùng hàm lặp khi giải Các khái niệm và kỹ thuật trừu tượng hóa sẽ được xem xét trong chương 2, 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), nếu giới hạn của hàm lặp

là không tồn tại (trường hợp này là có thể, ví dụ như khái niệm trừu tượng theo đa diện) hoặc nó đạt được giới hạn sau vô hạn bước lặp (ví dụ trừu tường tượng hóa phân khoảng và bát giác), sự hội tụ này có thể được đảm bảo hoặc/và tăng tốc độ hội tụ bằng cách sử dụng một số kỹ thuật mở rộng để mở rộng hơn các ước lượng nghiệm gần đúng trong hữu hạn các bước tiếp theo bởi một kỹ thuật thu hẹp để cải thiện nó [7] Trong khuôn khổ mà luận văn trình bày sẽ không đề cập đến các kỹ thuật liên quan đến trừu tượng phân khoảng, trừu tượng bát giác, trừu tượng đa diện cũng như các kỹ thuật liên quan đến mở rộng, thu hẹp điểm cố định

1.3 Tổng quan về tình hình nghiên cứu

Khảo sát ở trong nước: Hiện nay ở Việt Nam việc sử dụng các phương

pháp hình thức trong thực tế kiểm chứng phần mềm còn nhiều hạn chế Trong

3 mảng: phương pháp suy diễn (deductive method), kiểm chứng mô hình (model checking) và phân tích tĩnh với giải thích trừu tượng (static analysis with abstract interpretation) thì mảng phân tích tĩnh với giải thích trừu tượng

có nhiều lợi thế khi sử dụng thực tế, với khả năng tự động sinh được mô hình ngữ nghĩa trừu tượng từ mã nguồn để kiểm chứng và có thể áp dụng cho các

hệ thống vô hạn trạng thái Tuy nhiên, đây lại là mảng chưa nhận được nhiều

sự quan tâm nghiên cứu như hai mảng còn lại

Có rất ít đề tài nghiên cứu về ứng dụng kỹ thuật giải thích trừu tượng trong phân tích chương trình, các đề tài nghiên cứu tập trung chủ yếu ở Viện Công nghệ thông tin - Viện Hàn lâm Khoa học và Công nghệ Việt Nam, Đại học Quốc gia Hà Nội, Đại học Bách khoa Đà Nẵng và Đại học Quốc gia Thành phố Hồ Chí Minh

Trang 18

16

Khảo sát ở nước ngoài: tham khảo các kết quả của tác giả chính

Patrick Cousot, và những báo cáo tại các hội nghị thường niên VMCAI

(Verification, Model Checking, and Abstract Interpretation) trong những năm

gần đây Ứng dụng kỹ thuật giải thích trừu tượng trong phân tích chương trình

tĩnh tập trung vào hai mảng lớn: phân tích luồng dữ liệu (Data-flow Analysis)

và phân tích dựa trên tập hợp (Set-based Analysis) [8] Về ứng dụng có một

số công cụ (AiT, StackAnalysis, TVLA) nhưng còn rất nhiều hạn chế, chỉ

dừng lại ở mức hỗ thực nghiệm trong nghiên cứu, khi đưa vào ứng dụng trong

thực tế chưa đáp ứng được các yêu cầu của ngành công nghiệp phần mềm

Astrée là công cụ thương mại thành công nhất hiện nay, tuy nhiên miền ứng

dụng khá hẹp nên chưa được ứng dụng rộng rãi

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, kỹ thuật giải thích trừu tượng là một dải

nghiên cứu và ứng dụng quan trọng đối với ngành công nghệ phần mềm

Việc tiến hành đề tài 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 cơ bản ứng dụng vào thực tế kiểm soát

chất lượng phần mềm

1.4 Kết luận chương 1

Trong chương 1 luận văn đã trình bày tổng quan về phân tích chương

trình, các ý tưởng chính cần thiết cho việc nghiên cứu kỹ thuật giải thích

trừu tượng và vai trò của kỹ thuật này trong phân tích chương trình tĩnh

Khảo sát tình hình nghiên cứu ở trong và ngoài nước, các xu hướng đang

được ứng dụng của kỹ thuật này trong việc nâng cao chất lượng phần mềm

Về cơ sở lý thuyết nền tảng của kỹ thuật này như: ngữ nghĩa chương

trình, ngữ nghĩa vết, các phương thức trừu tượng, biểu diễn trừu tượng của

các ngữ nghĩa, …, sẽ được nghiên cứu sâu trong chương 2

Trang 19

17

Chương 2 - CỞ SỞ LÝ THUYẾT CỦA KỸ THUẬT GIẢI THÍCH

TRỪU TƯỢNG 2.1 Khái niệm về kỹ thuật giải thích trừu tượng

Kỹ thuật giải thích trừu tượng (Abstract interpretation): Là một kỹ thuật trong phân tích chương trình, kỹ thuật này giúp giải thích về ngữ nghĩa của một chương trình với những hàm đơn điệu trên các tập hợp đã được xếp thứ tự Lý thuyết giải thích trừu tượng nghiên cứu về ngữ nghĩa của chương trình, phương pháp trừu tượng hóa ngữ nghĩa của chương trình, và tính đủ (sound) cũng như tính chính xác (precise) của phương pháp xấp xỉ để tạo ra ngữ nghĩa trừu tượng

Kỹ thuật giải thích trừu tượng được hiểu theo nghĩa trực giác là việc thực thi một phần của một chương trình để lấy thông tin về nó: sơ đồ luồng điều khiển, sơ đồ luồng dữ liệu, … [8]

+ Hình thức hóa: Tất cả những gì đã được chuẩn tắc hóa và được chứng minh chặt chẽ bằng toán học

+ Phi hình thức hóa: dựa kinh nghiệm, thử nghiệm, mà không thể chứng minh được bằng toán học

Ứng dụng của kỹ thuật giải thích trừu tượng: Phân tích trừu tượng được ứng dụng trong phân tích cú pháp, trình biên dịch, gỡ lỗi chương trình 2.2 Ứng dụng của kỹ thuật giải thích trừu tượng

Kỹ thuật giải thích trừu tượng được ứng dụng rộng rãi và là một phần không thể thiếu trong lĩnh vực kiểm thử phần mềm Kỹ thuật giải thích trừu tượng được dùng để chứng minh tính đầy đủ, tính chính xác, tính đúng đắn cục bộ, tính đúng đắn toàn cục của hệ thống Một số ứng dụng của giải thích trừu tượng như [8]:

+ Phân tích cú pháp của dòng lệnh: phân tích thuộc tính và cú pháp của các dòng lệnh bằng việc giải thích trừu tượng các thuộc tính

và cú pháp

Trang 20

18

+ Phân tích tĩnh chương trình: đây là lĩnh vực được ứng dụng nhiều nhất của giải thích trừu tượng Phương pháp này phân tích mã nguồn của chương trình bằng cách trừu tượng hóa các thực thi của chương trình đó Từ đó chứng minh tính đủ, tính đúng đắn, tính chính xác của chương trình

+ Ẩn thông tin: trong các ngôn ngữ dựa trên các phần mềm bảo mật, các thông tin được ẩn đi để tránh sự theo dõi, phát hiện bằng cách

sử dụng việc trừu tượng hóa các thông tin của chương trình đó + Ngoài ra giải thích trừu tượng còn nhiều ứng dụng quan trọng khác trong các ngành công nghiệp như xe hơi, hàng không, vũ trụ,

2.3 Một số khái niệm cơ bản

2.3.1 Ngữ nghĩa cụ thể của chương trình

Ngữ nghĩa cụ thể của một chương trình được hình thức hóa (là một mô hình toán học của) mô tả tất cả các hành vi (quĩ đạo các đường thực thi) có thể của chương trình thực hiện trong tất cả các môi trường phù hợp, các thực thi có thể của chương trình được thể hiện trong hình 2.1

Hình 2.1 Sơ đồ hành vi có thể của chương trình

Ngữ nghĩa cụ thể của chương trình là vô hạn (tức là có vô số các đường thực thi như hình trên) các đối tượng toán học, do đó không thể thực hiện các tính toán trên miền ngữ nghĩa cụ thể của một chương trình Tất cả các câu hỏi

Trang 21

19

(được nêu trong chương 1) không tầm thường về ngữ nghĩa cụ thể của chương trình là không giải được [3]

2.3.2 Thuộc tính an toàn của chương trình

Thuộc tính an toàn (Safety properties) của một chương trình là việc không xuất hiện lỗi khi thực hiện các thực thi của chương trình đó trong bất

kỳ một môi trường nào Các hành vi của chương trình không vượt quá phạm

vi của môi trường cho phép minh họa trong hình 2.2

Hình 2.2: Quĩ đạo an toàn của các thực thi Trong hình 2.2 biểu diễn về tính an toàn của chương trình Bằng chứng cho tính an toàn bao gồm chứng minh rằng giao giữa miền ngữ nghĩa cụ thể của chương trình và vùng cấm (forbidden zone) là tập rỗng

Mặt khác, ngữ nghĩa cụ thể của chương trình là vô hạn, đây chính là vấn đề không giải quyết được (ngữ nghĩa cụ thể là không tính toán được) Lý

do này dẫn đến không thể xác minh hoàn toàn tự động tính an toàn của chương trình với nguồn tài nguyên phần cứng máy tính là hữu hạn hoặc không có sự tương tác của con người

Trong khi đó các phương pháp kiểm thử phổ biến hiện nay như kiểm thử và gỡ lỗi (Testing/Debugging) chỉ xem xét một tập con của tập tất cả các hành vi có thể của chương trình, vì vậy kỹ thuật này không phải là một chứng minh tối ưu cho tính đúng đắn của chương trình Độ phủ hạn chế là vấn đề

Trang 22

20

chính của các kỹ thuật dạng này Tức là một chương trình sẽ xuất hiện lỗi nếu các hành vi của nó vượt quá giới hạn cho phép của chương trình, có nghĩa là giao của quỹ đạo các hành vi với vùng cấm là khác rỗng [3]

Hình 2.3: Quĩ đạo không an toàn đối với kiểm thử/gỡ lỗi

Trong hình 2.3 biểu diễn cơ chế của kỹ thuật kiểm thử/gỡ lỗi, chỉ một số thực thi (đường nét liền) của chương trình được kiểm thử, các thực thi còn lại (nét đứt) thì không được kiểm tra và các lỗi của chương trình được mô tả trong hình là vi phạm vào vùng cấm (có thể xảy ra)

2.3.3 Miền trừu tượng

Miền trừu tượng là một đại số trừu tượng, được biểu diễn dưới dạng một thư viện các modul, cung cấp các mô tả về tính chất trừu tượng, các toán

tử và các lệnh của chương trình trên các tập thuộc tích trừu tượng của chương trình đó (ví dụ như thuộc tính trừu tượng các chuyển dịch biểu diễn hiệu quả các toán tử của các lệnh chương trình và các lệnh trừu tượng, …) Miền trừu tượng thường là một dàn đầy đủ, là sự trừu tượng hóa của tập lũy thừa [8]

Có hai loại miền trừu tượng hữu hạn và vô hạn Miền trừu tượng hữu hạn được sử dụng như là một thư viện đầy đủ cung cấp các mô tả về tính chất trừu tượng của một ngôn ngữ Miền trừu tượng vô hạn về cơ bản giống như miền trừu tượng hữu hạn, nó khác miền trừu tượng hữu hạn ở chỗ nó có thể cung cấp các mô tả về tính chất trừu tượng của các đối tượng vô hạn [3]

Trang 23

21

Ví dụ về miền trừu tượng

Trừu tượng hóa theo khoảng (không liên kết):

đó các ngữ nghĩa trừu tượng bao gồm tất cả các trường hợp có thể [3]

Mục đích chính của kỹ thuật giải thích trừu tượng chuyển chứng minh bài toán phân tích chương trình về dạng: nếu ngữ nghĩa trừu tượng của thỏa mãn đặc tả (tập các quĩ đạo hành vi có thể của chương trình giao với vùng vi phạm là tập rỗng) thì ngữ nghĩa cụ thể của cũng thỏa mãn đặc tả Hình 2.5 biểu diễn cơ chế trừu tượng hóa ngữ nghĩa cụ thể của giải thích trừu tượng Từ miền ngữ nghĩa cụ thể của chương trình được trừu tượng hóa thành miền ngữ nghĩa trừu tượng (màu xanh) bao trọn toàn bộ quĩ đạo hành vi có thể của

Trang 24

Các phương pháp hình thức chính là giải thích trừu tượng, trong đó có

sự khác biệt theo nhiều cách khác nhau để có được ngữ nghĩa trừu tượng từ ngữ nghĩa cụ thể của chương trình

 Kiểm chứng mô hình (Model checking)

+ Ngữ nghĩa trừu tượng của chương trình được đưa ra thủ công (bằng tay) bởi người sử dùng;

+ Được biểu diễn dưới hình thức của một mô hình hữu hạn của các thực thi chương trình;

+ Ngữ nghĩa trừu tượng có thể được tính toán tự động bằng các kỹ thuật có liên quan tới phân tích tĩnh

 Phương pháp suy diễn (Deductive methods)

+ Ngữ nghĩa trừu tượng được xác định bởi các điều kiện kiểm chứng (verification conditions);

+ Người sử dùng phải cung cấp các ngữ nghĩa trừu tượng theo hình thức lập luận qui nạp (ví dụ như bất biến);

Trang 25

23

+ Ngữ nghĩa trừu tượng có thể được tính toán tự động bằng các kỹ thuật có liên quan tới phân tích tĩnh

 Phân tích tĩnh (Static Analysis): Ngữ nghĩa trừu tượng được tính toán

tự động từ mã nguồn chương trình theo quy định các khái niệm trừu tượng định nghĩa trước (mà đôi khi có thể được thay đổi tự động/bằng tay bởi người

sử dụng) [3]

2.3.6 Tính chất cần thiết của ngữ nghĩa trừu tượng

Để đảm bảo tính chính xác của kết quả phân tích, miền ngữ nghĩa trừu tượng phải thỏa mãn một số thuộc tính cơ bản sau đây [3]:

+ Tính đủ: tất cả các lỗi đều không được bỏ qua, nếu trong miền ngữ nghĩa cụ thể chứa thông tin về lỗi (giao với vùng vi phạm khác rỗng) thì miền ngữ nghĩa trừu tượng cũng phải chứa thông tin về lỗi đó; + Tính chính xác: quá trình trừu tượng hóa để tạo ra miền ngữ nghĩa trừu tượng phải đủ chính xác để tránh cảnh báo sai (false alarm); + Đơn giản: Miền ngữ nghĩa trừu tượng phải đơn giản nhất có thể (tránh hiện tượng bùng nổ tổ hợp)

Biểu diễn tính đủ trong hình 2.6: Miền ngữ nghĩa trừu tượng không đảm bảo tính đủ nên bỏ sót lỗi/miền trừu tượng vi phạm vùng cấm

Trang 26

24

Hình 2.6: Trừu tượng hóa quĩ đạo hành vi không đảm bảo tính đủ

Biểu diễn tính chính xác trong hình 2.7: miền ngữ nghĩa trừu tượng không chính xác, vi phạm vào vùng cấm

Hình 2.7: Lỗi trừu tượng hóa quĩ đạo hành vi không chính xác

2.3.7 Tiêu chuẩn trừu tượng hóa

Tiêu chuẩn trừu tượng hóa đóng vai trò như là một cơ sở cho việc thiết

kế các phân tích tĩnh chương trình [3]:

+ Trừu tượng hóa dữ liệu chương trình

+ Trừu tượng hóa các toán tử cơ bản chương trình

+ Trừu tượng hóa các cấu trúc điều khiển chương trình như: cấu trúc rẽ nhánh, cấu trúc lặp,

Trang 27

25

Có thể được tham số hóa để cho phép thích nghi với miền ứng dụng

Hình 2.8: Tiêu chuẩn trừu tượng hóa theo khoảng 2.4 Lý thuyết dàn

Thứ tự từng phần: Một tập thứ tự từng phần (Partially ordered set -

poset) là một cấu trúc toán học: ( , ⊑), với là một tập hợp và ⊑ là một quan

hệ 2 ngôi trên thỏa mãn [11]:

+ Phản xạ (reflexivity): ∀ ∈ : ⊑

+ Phản đối xứng (anti-symmetry): ∀ , ∈ : ⊑ ∧ ⊑ ⇒ = + Bắc cầu (transitivity): ∀ , , ∈ : ⊑ ∧ ⊑ ⇒ ⊑

Nếu ( , ⊑) là một poset và ⊆ thì ( , ⊑) cũng là một poset

Để biểu diễn poset ta sử dụng biểu đồ Hasse bằng cách sử dụng các đồ

thị định hướng với tập đỉnh chính là , tập cạnh và tập cung chính là các quan

hệ 2 ngôi ⊑, nếu 〈 , 〉 ∈ ⊑ thì trên biểu đồ ta vẽ một cung hướng từ đỉnh

sang đỉnh y như trong hình 2.9 [3]

Cận trên: Cho ⊆ Ta nói rằng ∈ là một cận trên của , kí hiệu

⊑ , nếu ta có ∀ ∈ : ⊑

Cận dưới: Tương tự ta cũng có ∈ được gọi là một cận dưới của ,

kí hiệu ⊑ , nếu ∀ ∈ ∶ ⊑

Trang 28

Một dàn được gọi là đầy đủ khi cận trên nhỏ nhất tồn tại [11]

Lưu ý rằng một dàn có duy nhất một phần tử lớn nhất ⊤ được định nghĩa là ⊤ =⊔ và duy nhất một phần tử nhỏ nhất ⊥ được định nghĩa là

⊥=⊓ (do tính chất phản xạ của quan hệ thứ tự từng phần)

Ví dụ: ∀ ∈ ℤ: ⊥⊑⊥⊑ ⊑ ⊑ ⊤ ⊑ ⊤

Với mỗi tập hợp hữu hạn phần tử = {0, 1, 2, 3} định nghĩa một dàn (2 , ⊆), trong đó ⊥= ∅, ⊤ = , ⊔ = ∪ , và ⊓ = ∩ (dàn đảo ngược (2 , ⊇) cũng được mô tả tượng tự) được mô tả trong Hình 2.9

Hình 2.9: Biểu đồ Hasse của dàn (2 , ⊆) Chiều cao của dàn: Chiều cao của một dàn được định nghĩa là độ dài đường đi dài nhất từ phần tử ⊥ tới phần tử ⊤ Ở ví dụ trên thì chiều cao của dàn là 4, nhìn chung thì ở các dàn (2 , ⊆) hoặc (2 , ⊇) có chiều cao chính là

số phần tử | | [2]

Trang 29

27

Ngữ nghĩa của một ngôn ngữ lập trình sẽ xác định ngữ nghĩa của bất kỳ chương trình được viết trong ngôn ngữ đó Ngữ nghĩa của một chương trình cung cấp một cách hình thức hóa mô hình toán học của tất cả các hành vi có thể của một hệ thống máy tính thực hiện chương trình này, trong quá trình tương tác với bất kỳ môi trường có thể

Trong phần tiếp theo, chúng ta sẽ tiếp tục giải thích tại sao hình thức hóa ngữ nghĩa của một chương trình có thể được xác định là việc giải một hệ phương trình điểm cố định Tiếp theo, để so sánh ngữ nghĩa, chúng ta sẽ thấy rằng tất cả các ngữ nghĩa của một chương trình có thể được tổ chức trong một

hệ thống phân cấp bằng kỹ thuật trừu tượng hóa Bằng cách quan sát các tính toán ở mức độ trừu tượng khác nhau, người ta có thể xấp xỉ điểm cố định

(approximate fixpoints) từ đó tổ chức các ngữ nghĩa của một chương trình

Khi đó ta có 4 biểu thức khác nhau { + , ∗ , > + , + 1}, do

đó biểu diễn các toán tử của chương trình trên dàn được mô tả như sau:

= (2{ , ∗ , , }, ⊇) [2]

Trang 30

Định nghĩa 2.2 (điểm cố định): Cho một dàn L với chiều cao hữu hạn,

x là một điểm cố định của thỏa mãn f(x)=x, 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 là:

( ) = ⨆ (⊥) thỏa mãn điều kiện ( ) = ( )

Chứng minh: Chứng minh này là khá đơn giản

Trang 31

29

Bây giờ ta giả sử là một điểm cố định khác Từ đó ⊥⊑ ta suy ra rằng (⊥) ⊑ ( ) = Vì là hàm đơn điệu và bằng quy nạp ta có ( ) = (⊥) ⊑ Do đó, ( ) là điểm cố định nhỏ nhất, do tính chất phản đối xứng trên dàn nên nó là duy nhất [2]

Định lý Knaster-Tarski: Nếu : ⎯ là đơn điệu và là một dàn đầy đủ, các tập tất cả điểm cố định của cũng là một dàn đầy đủ [3]

2.5.2 Mở rộng ký hiệu điểm cố định

+ Ký hiệu: ( ) là điểm cố định nhỏ nhất, ta có ∀ ∈ : ( ( ) =) ⟹ ( ( ) ⊑ ) , ( ) là điểm cố định lớn nhất ∀ ∈: ( ( ) = ) ⟹ ( ( ) ⊒ )

Nếu là một tập hữu hạn ∀ > | |: ∃ ≤ | |: ( ) = ( ) thì hoặc

có thể là điểm cố định, hoặc bước lặp tạo thành một vòng tròn

Định lý Kleene: Nếu : ⎯ là đơn điệu, là một dàn đầy đủ và bảo toàn tất cả các cận trên nhỏ nhất thì là giới hạn của chuỗi [3]:

=⊥

Ví dụ về bước lặp hội tụ đến điểm cố định của hàm = được mô

tả trong Hình 2.11

Trang 32

30

Hình 2.11: Biểu diễn điểm cố định của =

Độ phức tạp về thời gian để tính toán một điểm cố định phụ thuộc vào

3 yếu tố sau đây:

+ Chiều cao của dàn, cung cấp một ràng buộc đối với biến số k;

+ Chi phí tính toán của hàm ;

+ Chi phí cho việc kiểm tra kết quả có bằng nhau không sau mỗi lần lặp Tính toán một điểm cố định có thể được minh họa là các bước đi lên trong một dàn bắt đầu từ điểm ⊥ (Hình 2.12) [2]

Hình 2.12: Tính toán điểm cố định trên dàn Thuộc tính đóng: Nếu , , , là các dàn có chiều cao hữu hạn thì tích × × × = {( , , , )| ∈ } với ⊑ được định nghĩa theo từng điểm (Point-wise) Cùng với ⊔ và ⊓ có thể được tính theo từng điểm như sau:

Trang 34

32

Hình 2.15: Dàn phẳng ( ) là một dàn có chiều cao là 2 Nếu và được định nghĩa như trên, khi đó ta thu được một dàn ánh xạ (map) với chiều cao hữu hạn theo thứ

tự từng điểm:

⟼ = {[ ⟼ , , ⟼ ]| ∈ }

⊑ ⇔ ∀ : ( ) ⊑ ( ) Nếu là tập hữu hạn và có chiều cao hữu hạn thì ℎ ℎ ( ⟼ ) = | | ℎ ℎ ( ) [2]

2.5.4 Phương trình và bất phương trình điểm cố định

Điểm cố định là điều rất đáng quan tâm, vì nó cho chúng ta các mối

liên hệ đến hệ thống phương trình để giải quyết vấn đề Cho là một dàn với chiều cao hữu hạn Một hệ phương trình được biểu diễn:

( , , ) = ( ( , , ), ( , , ), … , ( , , ))

Trang 35

Phân tích kiểu được bắt đầu với các cây cú pháp của một chương trình

và các ràng buộc được xác định qua các biến được gán cho các nút Phân tích làm việc theo cách này là một luồng không phân biệt, nghĩa là các kết quả giống nhau nếu một chuỗi câu lệnh 1 2 được hoán vị thành 2 1 Các phân tích này sử dụng luồng phân biệt là một đồ thị luồng điều khiển, đó là một biểu diễn khác của mã nguồn chương trình [2]

Một đồ thị luồng điều khiển (CFG) là một đồ thị có hướng, trong đó các nút (node) tương ứng với điểm chương trình và cạnh biểu diễn cho luồng

điều khiển Một CFG luôn có một điểm đơn đầu vào ký hiệu là entry, và một điểm đơn đầu ra, ký hiệu exit

Nếu v là một nút trong một CFG thì ta ký hiệu pred(v) biểu diễn tập hợp các nút kề trước và succ(v) tập hợp các nút kế tiếp

Dưới đây chúng ta xem xét các lệnh đơn giản mà CFG có thể được xây dựng Các CFG cho các phép gán (id = E;), output (printf(E);), lệnh

Trang 36

34

rời khỏi hàm (return E;), và khai báo biến (float E;) được xem xét như sau:

Hình 2.16: CFG cho các lệnh đơn giản

Đới với chuỗi lệnh tuần tự S1S2, ta bỏ các nút exit của lệnh S1 và nút entry của lệnh S 2 và gộp 2 lệnh này với nhau ta được:

Hình 2.17: CFG cho cấu trúc tuần tự Tương tự như vậy, các cấu trúc điều khiển cũng được mô hình hóa bằng CFG như sau:

Cấu trúc rẽ nhánh dạng khuyết (if E S1;), dạng đủ (if E S1 else S2;)

Trang 37

E

Trang 38

36

2.5.5 Phân tích luồng dữ liệu (Data Flow Analysis)

Phân tích luồng dữ liệu trong khuôn khổ các hàm đơn điệu là bắt đầu một đồ thị CFG và một dàn có chiều cao hữu hạn Dàn có thể được cố định cho tất cả các chương trình hoặc nó có thể được tham số hóa với các chương trình đã được xác định

Với mỗi nút v trong CFG, chúng ta gán một biến ⟦ ⟧ khoảng cách, trên các phần tử của Đối với mỗi cấu trúc trong các ngôn ngữ lập trình, sau đó chúng ta định nghĩa một ràng buộc luồng dữ liệu có liên quan tới giá trị của các biến của các nút tương ứng với những nút khác (thường là những nút kề trước và kề sau)

Đối với cách suy luận như vậy, chúng ta sẽ mô hình hóa sử dụng ký

hiệu ⟦ ⟧cho ⟦ ⟧ nếu S là cú pháp liên quan đến

Đối với một CFG đầy đủ, chúng ta có thể trích xuất có hệ thống một tập các ràng buộc trên các biến Nếu tất cả những ràng buộc này đưa ra được phương trình hoặc bất phương trình với vế phải là hàm đơn điệu, thì chúng ta

có thể sử dụng các thuật toán về điểm cố định để tính toán các nghiệm duy nhất nhỏ nhất

Các ràng buộc luồng dữ liệu là đúng nếu tất cả các nghiệm tương ứng với thông tin đúng đắn về chương trình Các phân tích được bảo toàn từ các nghiệm có thể nhiều hơn hoặc độ không chính xác là rất ít, nhưng việc tính toán các các nghiệm nhỏ nhất sẽ làm tăng độ phức tạp tỷ lệ với chiều dài ngữ nghĩa tính toán [2]

2.5.6 Thuật toán tìm điểm cố định

Nếu một CFG có các nút = { 1, 2, , }, khi đó chúng ta làm việc với dàn Giả sử rằng nút sinh ra phương trình dòng dữ liệu

⟦ ⟧ = (⟦ ⟧, … ⟦ ⟧), Chúng ta xây dựng các hàm ∶ → như đã

mô tả sẽ dễ hơn:

( , , ) = ( ( , , ), ( , , ), … , ( , , ))

Trang 39

37

Dưới đây là một số thuật toán tính toán điểm cố định:

Thuật toán naive để thính toán điểm cố định :

Trong trường hợp tổng quát, mỗi biến ⟦ ⟧ phụ thuộc vào các biến khác Tuy nhiên, một ví dụ thực tế của sẽ đọc các giá trị của một vài biến khác Chúng ta biểu diễn thông tin này như một hàm:

∶ → 2

Đối với mỗi nút v cho chúng ta biết tập con của các nút khác mà ⟦ ⟧

xuất hiện một cách không bình thường ở vế phải của phương trình luồng dữ liệu của nó Đó là, ( ) là tập hợp các nút chứa thông tin có thể phụ thuộc

Trang 40

Lý thuyết kỹ thuật giải thích trừu tượng xác định được rằng ngữ nghĩa của chương trình hoàn toàn có thể được biểu diễn dưới dạng điểm cố định [7] 2.6 Tiếp cận kết nối Galois cho kỹ thuật giải thích trừu tượng

2.6.1 Kết nối Galois

Kết nối Galois trong kỹ thuật giải thích trừu tượng là hình thức hóa ý tưởng phương trình: = ( ) có thể đầu tiên được đơn giản hóa thành

= ( ) Với tập các hàm ∈ ⎯ là đơn điệu và (⊑,⊔) là một

poset, và sau đó được giải bằng hàm lặp bắt đầu từ phần tử cơ bản

Kỹ thuật này được hiểu là một xấp xỉ rời rạc của và mở rộng khái niệm xấp xỉ này theo nhiều cách khác nhau, tới miền ngữ nghĩa

Ngày đăng: 25/09/2015, 11:10

HÌNH ẢNH LIÊN QUAN

Hình 1.1: Bài toán phân tích chương trình tổng quát  1.1.2. Phân tích chương trình tĩnh - Nghiên cứu kỹ thuật giải thích trừu tượng
Hình 1.1 Bài toán phân tích chương trình tổng quát 1.1.2. Phân tích chương trình tĩnh (Trang 14)
Hình 1.3: Các thành phần chính của phân tích chương trình - Nghiên cứu kỹ thuật giải thích trừu tượng
Hình 1.3 Các thành phần chính của phân tích chương trình (Trang 16)
Hình 2.5: Trừu tượng hóa quĩ đạo hành vi của chương trình - Nghiên cứu kỹ thuật giải thích trừu tượng
Hình 2.5 Trừu tượng hóa quĩ đạo hành vi của chương trình (Trang 24)
Hình 2.6: Trừu tượng hóa quĩ đạo hành vi không đảm bảo tính đủ - Nghiên cứu kỹ thuật giải thích trừu tượng
Hình 2.6 Trừu tượng hóa quĩ đạo hành vi không đảm bảo tính đủ (Trang 26)
Hình 2.8: Tiêu chuẩn trừu tượng hóa theo khoảng  2.4. Lý thuyết dàn - Nghiên cứu kỹ thuật giải thích trừu tượng
Hình 2.8 Tiêu chuẩn trừu tượng hóa theo khoảng 2.4. Lý thuyết dàn (Trang 27)
Hình 2.9: Biểu đồ Hasse của dàn (2 , ⊆)  Chiều cao của dàn: Chiều cao của một dàn được định nghĩa là độ dài  đường đi dài nhất từ phần tử ⊥ tới phần tử ⊤ - Nghiên cứu kỹ thuật giải thích trừu tượng
Hình 2.9 Biểu đồ Hasse của dàn (2 , ⊆) Chiều cao của dàn: Chiều cao của một dàn được định nghĩa là độ dài đường đi dài nhất từ phần tử ⊥ tới phần tử ⊤ (Trang 28)
Hình 2.10: Biểu diễn ngữ nghĩa của một chương trình thành dàn  2.5. Lý thuyết điểm cố định - Nghiên cứu kỹ thuật giải thích trừu tượng
Hình 2.10 Biểu diễn ngữ nghĩa của một chương trình thành dàn 2.5. Lý thuyết điểm cố định (Trang 30)
Hình 2.11: Biểu diễn điểm cố định của    = - Nghiên cứu kỹ thuật giải thích trừu tượng
Hình 2.11 Biểu diễn điểm cố định của = (Trang 32)
Hình 2.18: CFG cho cấu trúc rẽ nhánh - Nghiên cứu kỹ thuật giải thích trừu tượng
Hình 2.18 CFG cho cấu trúc rẽ nhánh (Trang 36)
Hình 2.19: CFG cho cấu trúc lặp - Nghiên cứu kỹ thuật giải thích trừu tượng
Hình 2.19 CFG cho cấu trúc lặp (Trang 37)
Hình 2.26: Trừu tượng hóa đến ngữ nghĩa tới được  Trong hình 2.26 mô tả các biểu diễn của ngữ nghĩa thông qua quá trình - Nghiên cứu kỹ thuật giải thích trừu tượng
Hình 2.26 Trừu tượng hóa đến ngữ nghĩa tới được Trong hình 2.26 mô tả các biểu diễn của ngữ nghĩa thông qua quá trình (Trang 50)
Hình 3.3: Trừu tượng hóa heap  Đặc tả heap trừu tượng đầu vào được biểu diễn dưới dạng 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 - Nghiên cứu kỹ thuật giải thích trừu tượng
Hình 3.3 Trừu tượng hóa heap Đặc tả heap trừu tượng đầu vào được biểu diễn dưới dạng 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 (Trang 57)
Hình 3.7: Biểu diễn quá trình làm việc của phân tích chương trình  3.3. Thuật toán sinh hệ ràng buộc Coerce và thuật toán giải hệ ràng buộc  tìm điểm cố định Focus - Nghiên cứu kỹ thuật giải thích trừu tượng
Hình 3.7 Biểu diễn quá trình làm việc của phân tích chương trình 3.3. Thuật toán sinh hệ ràng buộc Coerce và thuật toán giải hệ ràng buộc tìm điểm cố định Focus (Trang 61)
Hình  3.8:  Ứng  dụng  của  giải  thích  trừu  tượng  cho  phân  tích  câu  lệnh  x= x-> n cho hàm đảo ngược danh sách liên kết trong phần 3.2.5 - Nghiên cứu kỹ thuật giải thích trừu tượng
nh 3.8: Ứng dụng của giải thích trừu tượng cho phân tích câu lệnh x= x-> n cho hàm đảo ngược danh sách liên kết trong phần 3.2.5 (Trang 64)
Hình 3.9: Kết quả phân tích hàm tạo danh sách liên kết - Nghiên cứu kỹ thuật giải thích trừu tượng
Hình 3.9 Kết quả phân tích hàm tạo danh sách liên kết (Trang 79)

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

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