1. Trang chủ
  2. » Thể loại khác

Nghiên cứu kỹ thuật giải thích trừu tượng : Luận văn ThS. Toán học: 60 46 01 10

90 15 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

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 tơi 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 tài liệu hữu ích để hồn thành luận văn 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 Tố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 tài liệu q 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 để tơi hồn thành luận văn 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 tố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 tồ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 tố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 tốn phân tích chương trình tổng qt 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 tồn thực thi Hình 2.3: Quĩ đạo khơng an tồ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 tố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 tố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ế tố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 Trong q 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 q 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% tồn chi phí phát triển phần mềm, cịn mặt thời gian đơi cịn 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 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 tốn sinh hệ phương trình ràng buộc Coerce thuật tố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 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 tốn sinh hệ phương trình ràng buộc Coerce thuật tố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 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 tố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 tốn nhanh đơn giả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 ln ln 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, khơng phải 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 Ta thấy biểu thức có sẵn v có sẵn từ tất cạnh tính tố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 tố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

Ngày đăng: 15/09/2020, 14:28

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN