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

báo cáo nghiên cứu Static program analysis

12 184 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 12
Dung lượng 547,45 KB

Nội dung

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ - ĐHQGHN KHOA CÔNG NGHỆ THÔNG TIN CÔNG TRÌNH DỰ THI GIẢI THƯỞNG “SINH VIÊN NGHIÊN CỨU KHOA HỌC” NĂM 2014 Tên công trình: Static program analysis Họ và tên sinh viên: Nguyễn Tuấn Anh Nam, Nữ: Nam Lớp: K55CA Khoa: Công nghệ thông tin Người hướng dẫn: PGS.TS Nguyễn Việt Hà Th.S Vũ Quang Dũng Tổng quát Ngày nay, cùng với sự phát triển của công nghệ, các thiết bị di động là sự phát triển lớn mạnh của các phần mềm. Các chương trình không chỉ nhiều hơn mà cũng phức tạp hơn. Do đó việc xuất hiện lỗi trong phần mềm là không thể tránh khỏi. Một lỗi nhỏ trong chương trình cũng có thể gây ra những tác động khó lường. Vì vậy việc kiểm soát lỗi là đặc biệt quan trọng. Từ đó nảy sinh nhu cầu có những phương pháp để phân tích chương trình, từ đó có thể phát hiện lỗi. Hiện nay trên thế giới cũng đã có một số phương pháp, nhưng chưa được nhiều và mạnh. Các hướng nghiên cứu vẫn còn trùng lặp nhau. Một trong các phương pháp được cộng đồng quan tâm là phân tích chương trình tĩnh thông qua việc giải quyết các biểu thức ràng buộc. Trong bài báo này, tôi xin trình bày nghiên cứu của mình về phương pháp này. Tôi cũng sẽ có một chương trình demo, tuy còn đơn giản, nhưng đã cho cái nhìn tổng quan của phương pháp phân tích chương trình tĩnh thông qua việc giải quyết các biểu thức ràng buộc. Từ khóa: phân tích chương trình, phân tích tĩnh, giải quyết ràng buộc 2 Mục lục I, Đặt vấn đề ........................................................................................................................... 5 II, Phân tích chương trình tĩnh dựa trên việc giải quyết các ràng buộc ................................ 6 1, Tổng quan về việc phân tích chương trình ...................................................................... 6 2, Hướng đi dựa trên ràng buộc ........................................................................................... 6 2.1 Abstract 0-CFA Analysis ........................................................................................... 6 2.2 The Analysis .............................................................................................................. 7 III, Thực nghiệm .................................................................................................................... 9 1, Tổng quát ........................................................................................................................ 9 2, The framework JavaCC .................................................................................................. 9 IV, Kết luận và cải tiến trong tương lai ............................................................................... 11 1, Kết luận ......................................................................................................................... 11 2, Cải tiến trong tương lai ................................................................................................. 11 III, Tham khảo ..................................................................................................................... 12 3 Danh sách các hình ảnh Hình 1 : The nature of approximation: erring on the safe side. ................................................. 6 Hình 2. Tổng quan về dự án....................................................................................................... 9 Danh sách các mã giả Mã giả 1. Một ví dụ về chương trình ......................................................................................... 9 Mã giả 2. Một ví dụ về đầu ra .................................................................................................... 9 Mã giả 3. Toán tử điều kiện ..................................................................................................... 10 4 I, Đặt vấn đề Ngày nay, cùng với sự phát triển của công nghệ thông tin, các thiết bị phần cứng, các thiết bị di động là sự phát triển lớn mạnh của các phần mềm. Các chương trình không chỉ nhiều hơn mà cũng phức tạp hơn. Do đó việc xuất hiện lỗi, đặc biệt là các lỗi tinh vi trong phần mềm là không thể tránh khỏi. Một lỗi nhỏ trong chương trình cũng có thể gây ra những tác động khó lường. Những lỗi này có thể gây ra những hậu quả nghiêm trọng cả về tiền bạc, thời gian thậm chí mạng sống của con người. Ví dụ như vào ngày 04/06/1996, tên lửa Ariance 5 trị giá 500 triệu đô la đã phát nổ chỉ sau không đầy một phút được phóng lên vì một lỗi lưu trữ số. Lỗi trong mã điều khiển máy bức xạ Therac-25 là nguyên nhân trực tiếp dẫn đến việc tử vong của vài bệnh nhân vào năm 1980s. Vào năm 2002, một nghiên cứu thực hiện bởi Viện tiêu chuẩn và công nghệ thương mại Mỹ đã chỉ ra rằng lỗi phần mềm là rất phổ biến, có hại lớn ước tính thiệt hại cho nền kinh tế Mỹ 59 tỉ đô la tức khoảng 0.6% của GDP [1]. Vì vậy việc kiểm soát lỗi là đặc biệt quan trọng. Từ đó nảy sinh nhu cầu có những phương pháp để phân tích chương trình, giúp cảnh báo những lỗi có thể xảy ra. Phân tích chương trình không chỉ giúp ta tìm ra lỗi, mà còn giúp cho việc hiểu rõ phần mềm hơn, tối ưu chất lượng của chương trình, của compiler, nhận ra những nguy cơ bảo mật tiềm ẩn. Hiện nay trên thế giới có hai hướng đi là phân tích tĩnh (static analysis) và phân tích động (dynamic analysis) . Trong phân tích tĩnh lại có 5 phương pháp chính là: phân tích luồng dữ liệu (Data Flow Analysis), phân tích dựa vào các ràng buộc (Constraint Based Analysis), diễn dịch trừu tượng (Abstract Interpretation), Type and Effect Systems và Scalable interprocedural analysis. Và trong bài báo này tôi sẽ tập trung vào phương pháp phân tích dựa trên các ràng buộc, cụ thể tôi sẽ trình bày các kiến thức nền tảng của việc phân tích chương trình, Sau đó tôi sẽ đi sâu hơn vào phương pháp. Ở phần cuối sẽ là một chương trình demo mà tôi đang thực hiện. 5 II, Phân tích chương trình tĩnh dựa trên việc giải quyết các ràng buộc 1, Tổng quan về việc phân tích chương trình Trong việc phân tích chương trình, phân tích động thì sẽ cần phải chạy các chỉ thị của người dùng trong quá trình phân tích do đó sẽ thêm chi phí vào thời gian chạy, lượng sử dụng bộ nhớ. Trong khi đó việc phân tích tĩnh hướng tới việc hiểu một vài tính chất của chương trình mà không cần chạy nó. Kĩ thuật phân tích tĩnh này được dùng với mục đính dự đoán an toàn và tính toán xấp xỉ trên tập hợp các giá trị hay hành vi xuất hiện động trong lúc chạy. Tuy rằng có 5 phương pháp chính trong kĩ thuật phân tích chương trình tĩnh, một điểm chung của tất cả các hướng đi là để duy trì khả năng tính toán thì chỉ có thể đưa ra câu trả lời gần đúng. true answer {d1, …, dn} {dn+1, …, dN } {d1, …, dn, …dn+m} safe anwser Hình 1 : The nature of approximation: erring on the safe side. Tựu chung lại, ta hi vọng việc phân tích chương trình sẽ sinh ra một tập các khả năng lớn hơn những gì sẽ có thể xảy ra trong quá trình thực thi chương trình. 2, Hướng đi dựa trên ràng buộc Tư tưởng chính của thuật toán là trích xuất một số lượng các biểu thức so sánh hoặc các ràng buộc từ chương trình. Sau đó sẽ dùng các máy giải (SMT solver) riêng để giải quyết các ràng buộc này. 2.1 Abstract 0-CFA Analysis Tôi sẽ giới thiệu ngôn ngữ FUN, ta sẽ tập trung vào một ngôn ngữ lập trình hàm nhỏ: the untyped lambda calculus mở rộng với các toán tử đệ quy, điều kiện và định nghĩa địa phương. Mục đích của việc phân tích theo luồng (cũng giống như phân tích theo ràng buộc) là sẽ tính toán cho từng biểu thức con của tập các hàm có thể đánh giá và nhấn mạnh đây là 6 quan trọng khi ta có cả thể dán nhãn tất cả cá đoạn chương trình. Vì vậy ta sẽ sử dụng các cấu trúc ngữ pháp sau: e  Exp expressions (or labelled terms) t  Term terms (or unlabelled expressions) Var variables Const constants f, x  c  op  Op binary operators l  labels Lab Sự trừu tượng hóa ngữ pháp của ngôn ngữ được cho như sau: e ::= tl t ::= c | x | fn x => e0 | fun f x => e0 | e1 e2 | if e0 then e1 else e2 | let x = e1 in e2 | e1 op e2 Ở đây fun f x => e0 là một định nghĩa hàm trong đó fun f x => e0 is là một biến thể đệ quy của fn x => e0 khi mà tất cả sự xuất hiện tự do của f trong e0 dẫn đến fun f x => e0 chính nó. Biểu thức xây dựng let x = e1 in e2 là một định nghĩa địa phương không đệ quy mà thực tế tương đương với (fn x => e2)(e1). Chúng ta sẽ cần thêm khái niệm free variables của expressions và terms nên ta định nghĩa hàm: FV : (Term  Exp)  P(Var) theo một chuẩn sau FV(fn x => e0) FV(fun f x => e0) = FV(e0)\{x} = FV(e0)\{f, x} FV(let x = e1 in e2) = FV(e1)  (FV(e2)\{x}) 2.2 Sự phân tích Miền trừu tượng: Bây giờ chúng ta sẽ chỉ rõ 0-CFA analysis. Đây có thể coi như dạng đơn giản nhất có thể của Control Flow Analysis trong trường hợp không có thông tin gì khác kèm theo. Kết quả của 0-CFA analysis là một cặp (𝐶̂ , 𝑝̂ ) trong đó:  𝐶̂ là abstract cache liên kết với giá trị trừu tượng với từng điểm đã gắn nhãn chương trình.  𝑝̂ là abstract environment liên kết với giá trị trừu tượng với từng biến. 7 Điều trên được làm rõ bởi: ̂ = P(Term) abstract values 𝑣̂  𝑉𝑎𝑙 ̂ abstract environments ̂ = Var  𝑉𝑎𝑙 𝑝̂  𝐸𝑛𝑣 ̂ = Lab  𝑉𝑎𝑙 ̂ abstract caches 𝐶̂  𝐶𝑎𝑐ℎ𝑒 Trong đó một giá trị trừu tượng 𝑣̂ là một sự trừu tượng hóa của một tập các hàm: đó là một tập các term ở dạng fn x => e0 or fun f x => e0. 8 III, 1, Thực nghiệm Tổng quát Để làm rõ cho việc phân tích chương trình tĩnh bằng việc giải quyết các ràng buộc, tôi đang phát triển một chương trình nhỏ có cấu trúc như sau: Input All constraints Program Using off-theshelf constraint solvers Hình 2. Tổng quan về dự án Trong bài báo này cũng như trong project, tôi sẽ chỉ tập trung vào việc phân tách các ràng buộc. Việc giải các biểu thức ràng buộc có thể dùng SMT solver Ví dụ, ta có một chương trình: if (constraint A) … // do some things … while (constraint B) … // do some things Mã giả 1. Một ví dụ về chương trình Thì chương trình sẽ đưa ra kết quả (constraint A)  (constraint B) Mã giả 2. Một ví dụ về đầu ra 2, The framework JavaCC Trong dự án này, tôi sẽ dùng framework JavaCC để hỗ trợ trong quá trình phát triển. JavaCC dùng để sinh ra các parser và lexical analyzer. Parsers and lexical analysers chính là các thành phần dùng để xử lý với đầu vào là chuỗi các kí tự. 9 Hiện tại, tôi đang chỉ thực hiện việc bóc tách ràng buộc trên các chương trình viết bằng ngôn ngữ lập trình Java. Với sự hỗ trợ của JavaCC, tôi cần tìm tất cả các câu lệnh “if” và “while” sau đó lấy các biểu thức so sánh bên trong dấu ngoặc tròn. Trong tương lai tôi sẽ thêm các biểu thức ràng buộc dạng: (contraint C) ? (…//do something) : (…//do something) Mã giả 3. Toán tử điều kiện 10 IV, 1, Kết luận và cải tiến trong tương lai Kết luận Trong bài báo này tôi đã trình bày những định nghĩa cơ bản của việc phân tích chương trình tĩnh bằng việc giải quyết các ràng buộc. Hiểu được điều này là rất quan trọng trong việc tiếp tục nghiên cứu trong lĩnh vực phân tích chương trình. Mặc dù đây chỉ là những kiến thức nền tảng và việc thực thi dự án vẫn chưa hoàn thành, tôi sẽ tiếp tục hoàn thiện công việc. 2, Cải tiến trong tương lai + Đi sâu hơn vào nghiên cứu phương pháp phân tích chương trình tĩnh như là giải quyết các ràng buộc. + Hiểu một số ý tưởng chính của một số phương pháp khác. + Hoàn thành dự án của tôi và mở rộng cho ngôn ngữ C/C++. 11 III, Tham khảo [1] http://en.wikipedia.org/wiki/Software_bug. [2] http://www.ics.uci.edu/~guoqingx/courses/253/sp2013/. [3] Sumit Gulwani, Saurabh Srivastava, Ramarathnam Venkatesan, “Program Analysis as Contraint Solving”. [4] Flemming Nielson, Hanne Riis Nielson, Chris Hankin, “Principles of program analysis”, corrected 2nd printing 2005. 12 [...]... bài báo này tôi đã trình bày những định nghĩa cơ bản của việc phân tích chương trình tĩnh bằng việc giải quyết các ràng buộc Hiểu được điều này là rất quan trọng trong việc tiếp tục nghiên cứu trong lĩnh vực phân tích chương trình Mặc dù đây chỉ là những kiến thức nền tảng và việc thực thi dự án vẫn chưa hoàn thành, tôi sẽ tiếp tục hoàn thiện công việc 2, Cải tiến trong tương lai + Đi sâu hơn vào nghiên. .. vào nghiên cứu phương pháp phân tích chương trình tĩnh như là giải quyết các ràng buộc + Hiểu một số ý tưởng chính của một số phương pháp khác + Hoàn thành dự án của tôi và mở rộng cho ngôn ngữ C/C++ 11 III, Tham khảo [1] http://en.wikipedia.org/wiki/Software_bug [2] http://www.ics.uci.edu/~guoqingx/courses/253/sp2013/ [3] Sumit Gulwani, Saurabh Srivastava, Ramarathnam Venkatesan, Program Analysis as... http://www.ics.uci.edu/~guoqingx/courses/253/sp2013/ [3] Sumit Gulwani, Saurabh Srivastava, Ramarathnam Venkatesan, Program Analysis as Contraint Solving” [4] Flemming Nielson, Hanne Riis Nielson, Chris Hankin, “Principles of program analysis , corrected 2nd printing 2005 12 ... mạnh Các hướng nghiên cứu trùng lặp Một phương pháp cộng đồng quan tâm phân tích chương trình tĩnh thông qua việc giải biểu thức ràng buộc Trong báo này, xin trình bày nghiên cứu phương pháp... tĩnh (static analysis) phân tích động (dynamic analysis) Trong phân tích tĩnh lại có phương pháp là: phân tích luồng liệu (Data Flow Analysis) , phân tích dựa vào ràng buộc (Constraint Based Analysis) ,... Srivastava, Ramarathnam Venkatesan, Program Analysis as Contraint Solving” [4] Flemming Nielson, Hanne Riis Nielson, Chris Hankin, “Principles of program analysis , corrected 2nd printing 2005

Ngày đăng: 08/10/2015, 13:36

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w