Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 90 trang
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
Nội dung
ĐẠ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 ĐẠ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 LỜI CAM ĐOAN Tôi xin cam đoan công trình nghiên cứu có giúp đỡ 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 Công nghệ Việt Nam. Các nội dung kết nghiên cứu luận văn hoàn toàn trung thực, tham khảo theo tài liệu tác giả giáo viên hướng dẫn cung cấp liệt kê mục tài liệu tham khảo. Học viên Nguyễn Thanh Liêm LỜI CẢM ƠN Lời xin gửi lời cảm ơn chân thành bày tỏ lòng biết ơn sâu sắc 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 Công nghệ Việt Nam, thầy hướng dẫn tận tình, giúp đỡ truyền đạt cho kiến thức, kinh nghiệm quí báu suốt thời gian vừa qua, thầy cung cấp cho tài liệu hữu ích để hoàn thành luận văn này. Tôi xin gửi lời cảm ơn chân thành tới tất thầy, cô 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 đỡ kiến thức, tinh thần lời khuyên quí báu suốt trình học tập vừa qua. Cảm ơn đến tất bạn bè, đồng nghiệp Viện Công nghệ thông tin - Viện Hàn lâm Khoa học Công nghệ Việt Nam, trường Đại học Hải Dương cung cấp cho tài liệu quí báu, giúp đỡ, động viên tạo điều kiện cho tất mặt suốt năm qua. Cuối xin gửi lời cảm ơn tới thành viên gia đình tạo điều kiện tốt cho tôi, động viên, cổ vũ trình học tập nghiên cứu để hoàn thành luận văn này. Học viên Nguyễn Thanh Liêm MỤC LỤC LỜI CAM ĐOAN . LỜI CẢM ƠN . MỤC LỤC . DANH MỤC CÁC THUẬT NGỮ VÀ CHỮ VIẾT TẮT DANH MỤC CÁC HÌNH VẼ MỞ ĐẦU . Chương - TỔNG QUAN 10 1.1. Tổng quan phân tích chương trình 10 1.1.1. Ý tưởng 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 kỹ thuật giải thích trừu tượng 13 1.3. Tổng quan tình hình nghiên cứu . 15 1.4. Kết luận chương 16 Chương - 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 kỹ thuật giải thích trừu tượng 17 2.2. Ứng dụng kỹ thuật giải thích trừu tượng . 17 2.3. Một số khái niệm 18 2.3.1. Ngữ nghĩa cụ thể chương trình . 18 2.3.2. Thuộc tính an toàn chương trình 19 2.3.3. Miền trừu tượng 20 2.3.4. Độ phủ 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 ngữ nghĩa trừu tượng . 23 2.4. Lý thuyết dàn 25 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 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 đủ tí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ạng điểm cố định . 44 2.7.4. Bao đóng phản xạ bắc cầu (RTC - reflexive transitive closure) trừu tượng hó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ạng điểm cố định 46 2.7.7. Ngữ nghĩa tới trừu tượng hoá ngữ nghĩa RTC 47 2.7.8. Biểu diễn ngữ nghĩa tới dạng điểm cố định 47 2.8. Kết luận chương 48 Chương - THỰC NGHIỆM . 49 3.1. Giới thiệu TVLA . 49 3.2. Phân tích TVLA 50 3.2.1. Cấu trúc 3-valued Logic 51 3.2.2. Biểu diễn trạng thái 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 chương trình 55 3.2.5. Ví dụ phân tích chương trình . 57 3.3. Thuật toán sinh hệ ràng buộc Coerce 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 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 TVLA 70 3.4.2. Giới thiệu toán . 71 3.4.3. Đặc tả liệu đầu vào . 71 3.4.4. Kết phân tích 76 3.5. Kết luận chương 77 KẾT LUẬN . 78 TÀI LIỆU THAM KHẢO . 79 PHỤ LỤC A: . 81 PHỤ LỤC B: . 83 DANH MỤC CÁC THUẬT NGỮ VÀ CHỮ VIẾT TẮT TT Tiếng Anh - Viết tắt Abstract domain Tiếng Việt Miền trừu tượng Abstract semantics Ngữ nghĩa trừu tượng Concrete domain Miền cụ thể Concrete semantics Ngữ nghĩa cụ thể Continue - Tính liên tục hàm số Control Flow Graphs - CFG Đồ thị luồng điều khiển Data Flow Analysis - DFA Phân tích luồng liệu Fixpoint - fix Fixpoint approximation 10 Galois connections Điểm cố định Xấp xỉ điểm cố định Kết nối Galois 11 Interval semantics Ngữ nghĩa khoảng Dàn - Tập hợp phần tử có thứ tự phần có điểm chặn lớn trặn nhỏ Tính đơn điệu hàm Thu hẹp Tập hợp phần tử có thứ tự Tính xác Ngữ nghĩa tới 12 Lattice 13 14 15 16 17 Monotone - mon Narrowing Partial Ordered Set - Poset Precise Reachability semantics 18 Reflexive transitive closure - RTC Reflexive transitive closure 19 semantics - RTCs 20 Soundness Bao đóng phản xạ bắc cầu Ngữ nghĩa bao đóng phản xạ bắc cầu Tính đủ 21 Trace semantics Ngữ nghĩa vết, Tập hợp dấu vết trình chuyển đổi trạng thái chương trình. 22 Transition system 23 Widening Hệ dịch chuyển Mở rộng DANH MỤC CÁC HÌNH VẼ TT 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 Hình ảnh sử dụng Hình 1.1: Bài toán phân tích chương trình tổng quát Hình 1.2: Trừu tượng hóa theo điểm cố định Hình 1.3: Các thành phần phân tích chương trình Hình 2.1 Sơ đồ hành vi chương trình Hình 2.2: Quĩ đạo an toàn thực thi Hình 2.3: Quĩ đạo không an toàn kiểm thử/gỡ lỗi Hình 2.4: Biểu diễn miền trừu tượng Hình 2.5: Trừu tượng hóa quĩ đạo hành vi chương trình Hình 2.6: Trừu tượng hóa quĩ đạo hành vi không đảm bảo tính đủ Hình 2.7: Lỗi trừu tượng hóa quĩ đạo hành vi không xác Hình 2.8: Tiêu chuẩn trừu tượng hóa theo khoảng Hình 2.9: Biểu đồ Hasse dàn (2A,⊆) Hình 2.10: Biểu diễn ngữ nghĩa chương trình thành dàn Hình 2.11: Biểu diễn điểm cố định hàm cosx = x Hình 2.12: Tính toán điểm cố định dàn Hình 2.13: Phép cộng dàn Hình 2.14: Phép nâng dàn Hình 2.15: Dàn phẳng Hình 2.16: CFG cho lệnh đơn giản Hình 2.17: CFG cho cấu trúc Hình 2.18: CFG cho cấu trúc rẽ nhánh Hình 2.19: CFG cho cấu trúc lặp Hình 2.20: CFG hàm tính n! Hình 2.21: ¯F(¯x) xấp xỉ F(x) Hình 2.22: Biểu diễn quan hệ chuyển tiếp ngữ nghĩa chương trình Hình 2.23: Hệ chuyển dịch quĩ đạo thực thực thi chương trình Hình 2.24: Biểu diễn ngữ nghĩa vết thực thi Hình 2.25: Biểu diễn ngữ nghĩa vết dạng điểm cố định Hình 2.26: Trừu tượng hóa đến ngữ nghĩa tới Hình 3.1: Các toán tử 3-valued logic Kleene Hình 3.2: Biểu diễn heap cụ thể Hình 3.3: Trừu tượng hóa heap Hình 3.4: Kết heap trừu tượng đầu Hình 3.5: Trạng thái chương trình sử dụng cấu trúc 2-valued logic Hình 3.6: Trạng thái chương trình sử dụng 3-valued logic Hình 3.7: Biểu diễn trình làm việc phân tích chương trình Hình 3.8: Ứng dụng giải thích trừu tượng cho phân tích lệnh Hình 3.9: Kết phân tích hàm tạo danh sách liên kết Trang 12 14 14 18 19 20 21 22 24 24 25 26 28 30 30 32 31 32 34 34 34 35 35 41 42 42 43 44 48 52 53 55 56 58 58 59 62 77 MỞ ĐẦU Ngày nay, hệ thống phần mềm sử dụng cách phổ biến tất lĩnh vực đời sống, sản xuất, kinh doanh như: kinh tế, tài chính, kế toán, y tế, giáo dục, phủ,… , thiết bị điện tử công nghiệp dân dụng, phát triển trở lên ngày phức tạp. Sự phức tạp lớn hệ thống điều khiển hệ thống nhúng thiết bị công nghiệp, hàng không, vũ trụ, … Đối với đơn vị, cá nhân tổ chức làm phần mềm chuyên nghiệp họ hiểu sản phẩm phần mềm họ tạo chạy cách hoàn hảo từ lúc mà không mắc lỗi gì. Trong trình phát triển đưa vào sử dụng phần mềm bất kỳ, hầu hết tất lỗi phát sau phần mềm đưa vào sử dụng. Do vậy, hoạt động kiểm thử đóng góp vai trò quan trọng nhằm đảm bảo chất lượng hệ thống phần mềm. Các hoạt động kiểm thử nhà phát triển phần mềm tính đến suốt trình phát triển cho hệ thống phần mềm. Tuy nhiên, hoạt động kiểm thử thường có chi phí cao, chiếm đến 40% toàn chi phí phát triển phần mềm, mặt thời gian nhiều việc xây dựng hệ thống. Hầu hết hoạt động kiểm thử nhằm mục đích phân tích thành phần cấu trúc phần mềm để xác định số lượng lớn lỗi tiến trình phát triển: từ đặc tả mã hóa. Đối với hệ thống phần mềm phức tạp, cách giải đưa ban đầu với hệ thống cẩn thận khâu: phân tích, thiết kế, lập trình, kiểm thử để giảm thiểu cách tối đa lỗi phát sinh. Các nguồn lực cần thiết cho hoạt động kiểm thử quan trọng. Vì vậy, việc nghiên cứu phương pháp nhằm mục đích giảm chi phí trình kiểm thử đưa ra, đảm bảo mục tiêu tính hiệu phần mềm biện pháp hữu hiệu. // list elements along the n field. %i t[n](v_1, v_2) = n*(v_1, v_2) transitive reflexive // Integrity constraints for transitive reachability %r !t[n](v_1, v_2) ==> !n(v_1, v_2) %r !t[n](v_1, v_2) ==> v_1 != v_2 %r E(v_1) (t[n](v_1, v_2) & t[n](v_1, v_3) & !t[n](v_2, v_3)) ==> t[n](v_3, v_2) // For every program variable z the predicate r[n,z] holds for individual // v when v is reachable from variable z along the n field (more formally, // the corresponding list element is reachable from z). foreach (z in PVar) { %i r[n,z](v) = E(v_1) (z(v_1) & t[n](v_1, v)) } 3.4.3.3. Tệp TVP định nghĩa Actions Tệp tin TVP (actions.tvp) mô tả actions sử dụng có nội dung sau [13]: %action uninterpreted() { %t "uninterpreted" } %action skip() { %t "skip" } // Actions for statements manipulating pointer variables and pointer fields %action Set_Null_L(lhs) { %t lhs + " = NULL" { lhs(v) = } } %action Copy_Var_L(lhs, rhs) { %t lhs + " = " + rhs %f { rhs(v) } { lhs(v) = rhs(v) } } %action Malloc_L(lhs) { %t lhs + " = (L) malloc(sizeof(struct node)) " %new { lhs(v) = isNew(v) 73 t[n](v_1, v_2) = (isNew(v_1) ? v_1 == v_2 : t[n](v_1, v_2)) r[n, lhs](v) = isNew(v) foreach(z in PVar-{lhs}) { r[n,z](v) = r[n,z](v) } is[n](v) = is[n](v) } } %action Free_L(lhs) { %t "free(" + lhs + ")" %f { lhs(v) } %message (E(v, v_1) lhs(v) & n(v, v_1)) -> "Internal Error! " + lhs + "->" + n + " != NULL" { t[n](v_1, v_2) = t[n](v_1, v_2) foreach(z in PVar) { r[n,z](v) = r[n,z](v) } is[n](v) = is[n](v) } %retain !lhs(v) } %action Get_Next_L(lhs, rhs) { %t lhs + " = " + rhs + "->" + n %f { E(v_1, v_2) rhs(v_1) & n(v_1, v_2) & t[n](v_2, v) } %message (!E(v) rhs(v)) -> "Illegal dereference to\n" + n + " component of " + rhs { lhs(v) = E(v_1) rhs(v_1) & n(v_1, v) } } %action Set_Next_Null_L(lhs) { %t lhs + "->" + n + " = NULL" %f { lhs(v), // optimized change-formula for t[n] update-formula E(v_1, v_2) lhs(v_1) & n(v_1, v_2) & t[n](v_2, v) } %message (!E(v) lhs(v)) -> "Illegal dereference to\n" + n + " component of " + lhs { n(v_1, v_2) = n(v_1, v_2) & !lhs(v_1) 74 } } %action Set_Next_L(lhs, rhs) { %t lhs + "->" + n + " = " + rhs %f { lhs(v), rhs(v), // optimized change-formula for t[n] upate-formula E(v_4) rhs(v_4) & t[n](v_4, v_2) } %message (E(v_1, v_2) lhs(v_1) & n(v_1, v_2)) -> "Internal Error! " + lhs + "->" + n + " != NULL" %message (E(v_1, v_2) lhs(v_1) & rhs(v_2) & t[n](v_2, v_1)) -> "A cycle may be introduced\nby assignment " + lhs + "->" + n + "=" + rhs { n(v_1, v_2) = n(v_1, v_2) | lhs(v_1) & rhs(v_2) } } // Actions needed to simulate program conditions involving pointer // equality tests. %action Is_Not_Null_Var(lhs) { %t lhs + " != NULL" %f { lhs(v) } %p E(v) lhs(v) } %action Is_Null_Var(lhs) { %t lhs + " == NULL" %f { lhs(v) } %p !(E(v) lhs(v)) } %action Is_Eq_Var(lhs, rhs) { %t lhs + " == " + rhs %f { lhs(v), rhs(v) } %p A(v) lhs(v) rhs(v) } %action Is_Not_Eq_Var(lhs, rhs) { %t lhs + " != " + rhs %f { lhs(v), rhs(v) } %p !A(v) lhs(v) rhs(v) } ///////////////////////////////////////// // Actions for testing various properties 75 %action Assert_ListInvariants(lhs) { %t "assertListInvariants(" + lhs + ")" %f { lhs(v) } %p E(v) r[n,lhs](v) & is[n](v) %message ( E(v) r[n,lhs](v) & is[n](v) ) -> "The list pointed by " + lhs + " may be shared!" } %action Assert_No_Leak(lhs) { %t "assertNoLeak(" + lhs + ")" %f { lhs(v) } %p E(v) !r[n,lhs](v) %message ( E(v) !r[n,lhs](v) ) -> "There may be a list element not reachable from variable " + lhs + "!" } 3.4.3.4. Tệp TVP đặc tả ngữ nghĩa thực thi Trong phạm vi luận văn trình bày việc kiểm tra hàm chương trình gọi Create(), hàm tạo danh sách gắn thêm vào danh sách trỏ tới x [13]. // Sets %s PVar {x, f} #include "predicates.tvp" %% #include "actions.tvp" %% // Transition system for a function that creates new list of elements and // appends them to the list pointed by x. L1 uninterpreted() L2 // for (i=0; in = NULL; L4 Set_Next_L(f, x) L5 // f->n = x; L5 Copy_Var_L(x, f) L1 // x = f; // } exit Assert_ListInvariants(x) error exit Assert_No_Leak(x) error Nội dụng đặc tả đưa vào tệp create.tvp. 3.4.4. Kết phân tích Để thực phân tích TVLA thực lệnh sau: tvla create input. Trong tvla từ khóa gọi công cụ phân tích, create đường dẫn tới tệp create.tvp, input đường dẫn tới tệp input.tvs. 76 Hình 3.9: Kết phân tích hàm tạo danh sách liên kết Kết phân tích TVLA xuất dạng tệp TVS có nội dung mô tả cụ thể phụ lục B. 3.5. Kết luận chương Giới thiệu tổng quan công cụ mã nguồn mở TVLA việc phân tích hình dạng heap chương trình, sở toán học tảng TVLA . Các kỹ thuật liên quan đến biểu diễn ngữ nghĩa chương trình cấu trúc 2-valued logic, 3-valued logic phép nhúng hai cấu trúc, trình cập nhật công thức vị từ sau thực thi chương trình, thuật toán sinh hệ phương trình ràng buộc Coerce thuật toán tìm điểm cố định Focus để giải hệ phương trình ràng buộc nghiên cứu. 77 KẾT LUẬN Nội dung đạt Về đề tài tiếp cận sở lý thuyết ban đầu kỹ thuật giải thích trừu tượng, ứng dụng kỹ thuật việc phân tích tĩnh chương trình nhằm nâng cao chất lượng phần mềm, nắm bắt xu hướng phát triển để tiến tới cải tiến kỹ thuật giới nước. Đề tài tập trung nghiên cứu vấn đề biểu diễn ngữ nghĩa chương trình, phương pháp trừu tượng hóa ngữ nghĩa chương trình thông qua cách biểu diễn ngữ nghĩa nhiều dạng khác nhau. Trên sở lý thuyết tìm hiểu, đề tài tiếp cận mô trừu tượng dựa cấu trúc 2-valued logic 3-valued logic, thuật toán sinh hệ phương trình ràng buộc Coerce thuật toán giải hệ phương trình ràng buộc Focus để tìm điểm cố định, phép nhúng cấu trúc 2valued logic vào cấu trúc 3-valued logic để sinh ngữ nghĩa trừu tượng tiến hành thực nghiệm công cụ mã nguồn mở TVLA cho phân tích chương trình cụ thể cài đặt ngôn ngữ C. Một số hạn chế Trong trình nghiên cứu đề tài, thân cố gắng với tham vọng cải tiến sở lý thuyết cải tiến công cụ thực nghiệm, chưa thực với nhiều lý khác nhau, việc ứng dụng kỹ thuật vào thực tế gặp nhiều khó khăn, công cụ hỗ trợ cho kỹ thuật dừng lại mức thực nghiệm cho nghiên cứu bản. Hướng nghiên cứu Cải tiến mặt sở lý thuyết cho kỹ thuật để tăng khả ứng dụng vào thực tế với lớp toán khác. Cải tiến công cụ thực nghiêm dựa mã nguồn mở TVLA để tăng khả phân tích tĩnh tự động cho chương trình, áp dụng vào giảng dạy cho sinh viên ngành Công nghệ thông tin trường Đại học, Cao đẳng. 78 TÀI LIỆU THAM KHẢO [1] M. Sagiv, T. Reps, and R. Wilhelm. Parametric shape analysis via 3valued logic. ACM Transactions on Programming Languages and Systems (TOPLAS), 24(3):217–298, 2002. [2] Michael I. Schwartzbach. Lecture Notes on Static Analysis. BRICS, Department of Computer Science University of Aarhus, Denmark 2009. [3] Patrick Cousot, Jer C.Hunsaker. An informal overview of abstract interpretation. Massachusetts Institute of Technology Department of Aeronautics Astronautics, Course 16.399, 2005. [4] Patrick Cousot, Radhia Cousot. Abstract Interpretation: A Unified Lattice Model for Static Analysis of Programs by Construction or Approximation of Fixpoints. Conference Record of the Fourth ACM Symposium on Principles of Programming Languages, Los Angeles, California, USA, January 1977. ACM, 1977, pp. 238-252. [5] Patrick Cousot, Radhia Cousot. Basic concepts of abstract interpretation, Web page maintained by P. Cousot, 2004. [6] Patrick Cousot, Radhia Cousot. Comapring the Galois Connection and Widening / Narrowing Approaches to Abstract Interpretation. In Maurice Bruynooghe and Martin Wirsing. Proc. 4th Int. Symp. on Programming Language Implementation and Logic Programming (PLILP). LNCS 631. Springer. pp. 269–296, 1992. [7] Patrick Cousot. Abstract Interpretation Based Formal Methods and Future Challenges. In Informatics, 10 Years Back — 10 Years Ahead, R. Wilhelm (Ed.), Lecture Notes in Computer Science 2000, Springer, pp. 138–156, 2001. [8] Patrick Cousot. Abstract Interpretation. Web page maintained by P. Cousot, 2008. 79 [9] Patrick Cousot. Constructive Design of a Hierarchy of Semantics of a Transition System by Abstract Interpretation. In Electronic Notes in Theoretical Computer Science, Volume 6, 1997. [10] Patrick Cousot. Partial Completeness of Abstract Fixpoint Checking. Lecture Notes in Computer Science Volume 1864. Springer Berlin Heidelberg, 2000, pp 1-25. [11] Roberto Giacobazzi (Università di Verona, Italie), Nicolas Halbwachs (Vérimag, France), Manuel Hermenegildo (IMDEA Software Institute & Technical University of Madrid, Espagne). Static analysis by abstract interpretation of concurrent programs, 2013. [12] Steve S.Muchnick, Patrick Cousot. Semantic Foundations of Program Analysis. In Program Flow Analysis: Theory and Applications. PrenticeHall, Inc., Englewood Cliffs, New Jersey, U.S.A., 1981. [13] T. Lev-Ami and M. Sagiv. Tvla: A framework for kleene logic based static analyses. Master’s thesis, Tel Aviv University, 2000. 80 PHỤ LỤC A: Phân tích biểu thức có sẵn: Một biểu thức không bình thường (nontrivial) chương trình có sẵn (available) điểm chương trình giá trị tính toán sẵn trước thực thi. Việc xác định biểu thức có sẵn trước thực thi giúp cho việc tính toán nhanh đơn giản hơn. Dàn cho phân tích tập hợp biểu thức xảy cho tất điểm chương trình tập đảo ngược (reverse). Đối với nút v CFG tương ứng v Dàn L chứa tập biểu thức với biến ràng buộc ⟦ ⟧ đảm bảo luôn có sẵn điểm chương trình kế sau nút đó. Ví dụ, biểu thức a + b có sẵn điều kiện vòng lặp, có sẵn phép gán vòng lặp. [2] + Với nút entry, có ràng buộc là: ⟦ ⟧ = {} + Nếu v chứa điều kiện E lệnh return E, ràng buộc là: ⟦ ⟧=⋂ ∈ ( ) ( )⟦ ⟧ ∪ + Đối với v chứa phép gán = , ràng buộc là: ⟦ ⟧=⋂ ∈ ( )↓ ( )⟦ ⟧ ∪ Đối với nút khác, ràng buộc là: ⟦ ⟧ = ⋂ ∈ ( )⟦ ⟧ Với hàm ↓ loại bỏ tất biểu thức có chứa tham chiếu đến biến , hàm exps định nghĩa là: ( )= ∅ ( ) =∅ ( )= ∅ ( 2) = { 2} ∪ ( 1) ∪ ( 2) Với op phép toán nhị phân bất kỳ. Ta thấy biểu thức có sẵn v có sẵn từ tất cạnh tính toán nút v, trừ giá trị hủy lệnh gán. Một lần nữa, phía vế phải ràng buộc hàm đơn điệu [2]. int func() { var x,y,z,a,b; z = a+b; y = a*b; while (y > a+b) { a = a+1; x = a+b; 81 } } là: Ta có biểu thức khác nhau, dàn cho phân tích với chương trình , } = (2{ , ∗ , , ⊇) Ta có sơ đồ luồng chương trình sau: Các ràng buộc sinh sau: ⟦ ⟧ = {} ⟦ ⟧ , , , , ;⟧ = ⟦ ⟦ = + ⟧ = ( + )↓ ⟦ = ∗ ⟧ = (⟦ = + ⟧ ∪ ( ∗ )) ↓ ⟦ > + ⟧ = (⟦ = ∗ ⟧ ∩ ⟦ = + ⟧) ∪ 82 ( > + ) ⟦ = + 1⟧ = (⟦ > + ⟧ ∪ ( + 1)) ↓ ⟦ = + ⟧ = (⟦ = + 1⟧ ∪ ( + )) ↓ ⟦ ⟧ = ⟦ > + ⟧ Áp dụng thuật toán lặp Chaotic tìm điểm cố định ta thu nghiệm nhỏ nhất: ⟦ ⟧ = {} ⟦ , , , , ; ⟧ = {} ⟦ = + ⟧ = { + } ⟦ = ∗ ⟧ = { + , ∗ } ⟦ > + ⟧ = { + , > + } ⟦ = + 1⟧ = {} ⟦ = + ⟧ = { + } ⟦ ⟧ = { + } Nhận thấy biểu thức có sẵn điểmchương trình kế trước nút v tính ⋂ ∈ ( )⟦ ⟧ . Từ đó, trình biên dịch tối ưu hóa hệ thống làm chương trình trở nên hiệu quả/đơn giản [2]: int func(){ var x,y,z,a,b,t; t = a+b; z = t; y = a*b; while (y > t) { a = a+1; t = a+b; x = t; } } PHỤ LỤC B: Kết phân tích // @VERSION@ (built on @DATE@) %location L1 = { %n = {} %p = {} %n = {_1, _0} %p = { inac = {_1:1, _0:1} r[n,x] = {_1:1, _0:1} sm = {_1:1/2} 83 x = {_0:1} n = {_1->_1:1/2, _0->_1:1/2} t[n] = {_1->_1:1/2, _0->_1:1, _0->_0:1} } %n = {_1} %p = { inac = {_1:1} r[n,x] = {_1:1} x = {_1:1} t[n] = {_1->_1:1} } %n = {_1} %p = { inac = {_1:1} f = {_1:1} r[n,f] = {_1:1} r[n,x] = {_1:1} x = {_1:1} t[n] = {_1->_1:1} } %n = {_2, _1} %p = { inac = {_2:1, _1:1} f = {_2:1} r[n,f] = {_2:1, _1:1} r[n,x] = {_2:1, _1:1} sm = {_1:1/2} x = {_2:1} n = {_2->_1:1/2, _1->_1:1/2} t[n] = {_2->_2:1, _2->_1:1, _1->_1:1/2} } } %location L2 = { %n = {_2, _1} %p = { inac = {_2:1, _1:1} f = {_2:1} r[n,f] = {_2:1, _1:1} r[n,x] = {_2:1, _1:1} sm = {_1:1/2} x = {_2:1} 84 n = {_2->_1:1/2, _1->_1:1/2} t[n] = {_2->_2:1, _2->_1:1, _1->_1:1/2} } %n = {} %p = {} %n = {_1, _0} %p = { inac = {_1:1, _0:1} r[n,x] = {_1:1, _0:1} sm = {_1:1/2} x = {_0:1} n = {_1->_1:1/2, _0->_1:1/2} t[n] = {_1->_1:1/2, _0->_1:1, _0->_0:1} } %n = {_1} %p = { inac = {_1:1} r[n,x] = {_1:1} x = {_1:1} t[n] = {_1->_1:1} } %n = {_1} %p = { inac = {_1:1} f = {_1:1} r[n,f] = {_1:1} r[n,x] = {_1:1} x = {_1:1} t[n] = {_1->_1:1} } } %location L3 = { %n = {_2, _1} %p = { inac = {_2:1, _1:1} f = {_2:1} r[n,f] = {_2:1} r[n,x] = {_1:1} x = {_1:1} t[n] = {_2->_2:1, _1->_1:1} } 85 %n = {_1} %p = { inac = {_1:1} f = {_1:1} r[n,f] = {_1:1} t[n] = {_1->_1:1} } %n = {_2, _1, _0} %p = { inac = {_2:1, _1:1, _0:1} f = {_2:1} r[n,f] = {_2:1} r[n,x] = {_1:1, _0:1} sm = {_1:1/2} x = {_0:1} n = {_1->_1:1/2, _0->_1:1/2} t[n]={_2->_2:1, _1->_1:1/2, _0->_1:1, _0->_0:1} } } %location L4 = { %n = {_2, _1} %p = { inac = {_2:1, _1:1} f = {_2:1} r[n,f] = {_2:1} r[n,x] = {_1:1} x = {_1:1} t[n] = {_2->_2:1, _1->_1:1} } %n = {_1} %p = { inac = {_1:1} f = {_1:1} r[n,f] = {_1:1} t[n] = {_1->_1:1} } %n = {_2, _1, _0} %p = { inac = {_2:1, _1:1, _0:1} f = {_2:1} r[n,f] = {_2:1} 86 r[n,x] = {_1:1, _0:1} sm = {_1:1/2} x = {_0:1} n = {_1->_1:1/2, _0->_1:1/2} t[n]={_2->_2:1, _1->_1:1/2, _0->_1:1, _0->_0:1} } } %location L5 = { %n = {_1} %p = { inac = {_1:1} f = {_1:1} r[n,f] = {_1:1} t[n] = {_1->_1:1} } %n = {_2, _1} %p = { inac = {_2:1, _1:1} f = {_2:1} r[n,f] = {_2:1, _1:1} r[n,x] = {_1:1} x = {_1:1} n = {_2->_1:1} t[n] = {_2->_2:1, _2->_1:1, _1->_1:1} } %n = {_2, _1, _0} %p = { inac = {_2:1, _1:1, _0:1} f = {_2:1} r[n,f] = {_2:1, _1:1, _0:1} r[n,x] = {_1:1, _0:1} sm = {_1:1/2} x = {_0:1} n = {_2->_0:1, _1->_1:1/2, _0->_1:1/2} t[n]={_2->_2:1,_2->_1:1,_2->_0:1,_1->_1:1/2, _0->_1:1, _0->_0:1} } } %location exit = { %n = {_1, _0} %p = { 87 inac = {_1:1, _0:1} r[n,x] = {_1:1, _0:1} sm = {_1:1/2} x = {_0:1} n = {_1->_1:1/2, _0->_1:1/2} t[n] = {_1->_1:1/2, _0->_1:1, _0->_0:1} } %n = {} %p = {} %n = {_1} %p = { inac = {_1:1} f = {_1:1} r[n,f] = {_1:1} r[n,x] = {_1:1} x = {_1:1} t[n] = {_1->_1:1} } %n = {_2, _1} %p = { inac = {_2:1, _1:1} f = {_2:1} r[n,f] = {_2:1, _1:1} r[n,x] = {_2:1, _1:1} sm = {_1:1/2} x = {_2:1} n = {_2->_1:1/2, _1->_1:1/2} t[n] = {_2->_2:1, _2->_1:1, _1->_1:1/2} } %n = {_1} %p = { inac = {_1:1} r[n,x] = {_1:1} x = {_1:1} t[n] = {_1->_1:1} } } %location error = {} Như kết TVLA sinh biểu diễn trừu tượng heap điểm chương trình tương ứng CFG. Các tính chất kiểm tra thỏa mãn phần %location error {} rỗng. 88 [...]... được nghiên cứu sâu trong chương 2 16 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. .. 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. .. 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 đủ,... miền trừu tượng 2.3.4 Độ phủ của kỹ thuật giải thích trừu tượng Do quá trình phân tích của kỹ thuật giải thích trừu tượng và nó được xem xét trên ngữ nghĩa trừu tượng của chương trình Có thể nói rằng ngữ nghĩa trừu tượng được xem xét là tập cha của tập ngữ nghĩa cụ thể của chương trình, do đó 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. .. 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... 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... 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] 20 Ví dụ về miền trừu tượng Trừu tượng hóa theo khoảng (không liên kết): ⟹ [ , ], ⟹ [ ′, ′], Trừu tượng hóa theo đa diện (có liên kết): + − 2 ≤ 10, Trừu tượng hóa chênh lệch-ràng buộc (liên... 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. .. 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... được giải thích rằng tất cả các câu hỏi thú vị nêu trên về hành vi của chương trình là không giải được, điều này rất dễ dàng thấy trong bất kỳ trường hợp đặc biệt nào [2] 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ỹ . sẽ được nghiên cứu sâu trong chương 2. 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. 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. 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