NGHIÊN cứu kỹ THUẬT PHÂN TÍCH CHƯƠNG TRÌNH TĨNH TRONG VIỆC NÂNG CAO CHẤT LƯỢNG PHẦN mềm

85 1.3K 16
NGHIÊN cứu kỹ THUẬT PHÂN TÍCH CHƯƠNG TRÌNH TĨNH TRONG VIỆC NÂNG CAO CHẤT LƯỢNG PHẦN mềm

Đ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

Sự tiến hóa nhanh chóng của các thiết bị phần cứng trong hơn 30 năm qua đã đưa đến hệ quả về sự phát triển theo cấp số nhân của kích cỡ các chương trình phần mềm chạy trên đó. Quy mô của những ứng dụng cực lớn này (khoảng từ 1 tới 40 triệu dòng mã lệnh) vẫn tiếp tục gia tăng trong thời gian tới. Những phần mềm như thế cần phải được thiết kế với chi phí vừa phải trong khi vẫn phải bảo trì, nâng cấp trong toàn bộ vòng đời của chúng, tầm 20 năm. Một thực tế là quy mô và hiệu quả của những nhóm lập trình và bảo trì chúng không thể tăng theo tỉ lệ như vậy. Với hoàn cảnh đó, tỉ lệ giả định 1 lỗi trong 1000 dòng lệnh đối với những phần mềm như vậy là quá lạc quan và sẽ không thể đạt được trong những hệ thống đòi hỏi độ an toàn cực cao. Do đó, vấn đề về độ tin cậy của phần mềm (software reliability) chắc chắn là một mối quan tâm và thách thức đối với xã hội hiện đại ngày càng phụ thuộc vào các dịch vụ do máy tính đem lại. Nhiều kỹ thuật kiểm chứng phần mềm (software verification) và các công cụ hỗ trợ đi kèm đã được phát triển để thực thi hoặc giả lập chương trình trên nhiều môi trường khác nhau. Tuy nhiên, gỡ rối mã dịch hoặc giả lập mô hình của mã nguồn các chương trình không thể mở rộng quy mô và thường chỉ xét được mức độ bao phủ hạn chế các hành vi động của chương trình. Các phương pháp hình thức trong kiểm chứng chương trình (formal methods) cố gắng chứng minh một cách tự động rằng chương trình sẽ thực thi đúng đắn trên mọi môi trường được đặc tả. Mảng nghiên cứu này bao gồm các phương pháp suy dẫn (deductive 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). Ba nhóm đầu tập trung vào việc kiểm chứng phần mềm tại mức mô hình, trong khi nhóm cuối cùng xử lý phần mềm tại mức mã nguồn. Phân tích chương trình tĩnh thu hút sự quan tâm nhất do nền tảng lý thuyết hình thức của nó cũng như mục đích của nó đối với các ứng dụng của nó trong thực tế. Kỹ thuật này phát hiện tính chấthành vi của một chương trình mà không yêu cầu chạy chương trình đó. Ngoài ra, một số lỗi chương trình như việc khởi tạosử dụng biến chương trình, biến con trỏ NULL,... có thể được phát hiện bởi kỹ thuật này. Mục tiêu chính của luận văn là cập nhật được những xu thế trên thế giới trong lĩnh vực phân tích chương trình và cải tiến những kỹ thuật này. Cụ thể, luận văn tập trung vào nghiên cứu kỹ thuật phân tích chương trình dựa trên đồ thị luồng dữ liệu để nâng cao chất lượng phần mềm. Tiến hành thực nghiệm trên công cụ SOOT, một công cụ mã nguồn mở phân tích chương trình viết bằng Java trên môi trường tích hợp phát triển Eclipse. Cấu trúc của luận văn bao gồm: Chương 1 giới thiệu tổng quan về phân tích chương trình tĩnh. Trong chương này, trình bày định nghĩa kỹ thuật phân tích chương trình tĩnh, ứng dụng kỹ thuật phân tích, điểm mạnh và những hạn chế của kỹ thuật phân tích tĩnh. Và phần chính trong Chương 1 là phần kiến thức nền tảng chính sử dụng trong kỹ thuật phân tích chương trình tĩnh. Tiếp theo là Chương 2 trình bày về phân tích luồng dữ liệu. Cụ thể, trình bày phương pháp phân tích luồng dữ liệu trong một hàm không có chứa lời gọi hàm (nội thủ tục) và phân tích luồng dữ liệu đồ thị luồng dữ liệu cho cả chương trình với lời gọi hàm (liên thủ tục). Chương 3 trình bày phần thực nghiệm với SOOT một công cụ nguồn mở để phân tích chương trình viết bằng Java trên môi trường tích hợp phát triển là Eclipse. Cuối cùng là phần kết luận và các tài liệu tham khảo.

Mục lục LỜI CÁM ƠN 1 LỜI CAM ĐOAN 2 MỤC LỤC 3 DANH MỤC CÁC KÝ HIỆU VÀ CHỮ VIẾT TẮT 5 DANH MỤC CÁC HÌNH VẼ 6 MỞ ĐẦU 7 1 Giới thiệu 9 1.1 Giới thiệu về phân tích chương trình . . . . . . . . . . . . . . . . . . .9 1.2 Điểm mạnh và điểm yếu . . . . . . . . . . . . . . . . . . . . . . . . 1.0 1.3 Các công nghệ phân tích chương trình tĩnh . . . . . . . . . . . . . . . 1.0 1.4 Nền tảng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 1.4.1 Đồ thị luồng điều khiển . . . . . . . . . . . . . . . . . . . . . 1.2 1.4.2 Lý thuyết Dàn . . . . . . . . . . . . . . . . . . . . . . . . . . 1.5 1.4.3 Thuật toán điểm cố định . . . . . . . . . . . . . . . . . . . . . 2.1 2 Phân tích chương trình tĩnh 24 2.1 Phân tích luồng dữ liệu nội thủ tục . . . . . . . . . . . . . . . . . . . 2.4 2.1.1 Phân tích quay lại (backward) . . . . . . . . . . . . . . . . . . 2.5 2.1.2 Phân tích chuyển tiếp (forward) . . . . . . . . . . . . . . . . . 3.1 2.2 Phân tích luồng dữ liệu liên thủ tục . . . . . . . . . . . . . . . . . . . 4.0 2.2.1 Xây dựng đồ thị luồng dữ liệu . . . . . . . . . . . . . . . . . . 4.1 2.2.2 Tính cảm ngữ cảnh (context sensitivity) . . . . . . . . . . . . . 4.3 2.2.3 Ứng dụng phân tích luồng dữ liệu liên thủ tục . . . . . . . . . 4.5 1 3 Thực nghiệm 47 3.1 Tổng quan về SOOT . . . . . . . . . . . . . . . . . . . . . . . . . . 4.7 3.1.1 Giới thiệu . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.7 3.2 Phân tích chương trình cùng với SOOT trong Eclipse . . . . . . . . . 4.8 KẾT LUẬN 52 TÀI LIỆU THAM KHẢO 53 PHỤ LỤC A 55 PHỤ LỤC B 57 PHỤ LỤC C 60 PHỤ LỤC D 62 DANH MỤC CÁC KÝ HIỆU VÀ CHỮ VIẾT TẮT CFG Control Flow Graph CNPM Công nghệ phần mềm CNTT Công nghệ thông tin DFA Data Flow Analysis Danh sách hình vẽ 1.1 CFG cho các lệnh cơ bản. . . . . . . . . . . . . . . . . . . . . . . . 1.3 1.2 CFG cho các lệnh tuần tự. . . . . . . . . . . . . . . . . . . . . . . . 1.3 1.3 CFG cho các lệnh if, if-else. . . . . . . . . . . . . . . . . . . . . . . 1.3 1.4 CFG cho các lệnh while, for. . . . . . . . . . . . . . . . . . . . . . . 1.4 1.5 CFG của chương trình tính giai thừa. . . . . . . . . . . . . . . . . . . 1.5 1.6 Biểu đồ Hasse biểu diễn Dàn. . . . . . . . . . . . . . . . . . . . . . 1.6 1.7 Các biểu đồ Hasse là Dàn. . . . . . . . . . . . . . . . . . . . . . . . 1.7 1.8 Các biểu đồ Hasse không phải là Dàn. . . . . . . . . . . . . . . . . . 1.7 1.9 Phép toán cộng dàn. . . . . . . . . . . . . . . . . . . . . . . . . . . 1.9 1.10 Phép toán nâng (lift) dàn. . . . . . . . . . . . . . . . . . . . . . . . . 1.9 1.11 Phép toán lift của các tập tạo thành dàn. . . . . . . . . . . . . . . . . 2.0 2.1 Dàn cho chương trình phân tích tính sống của biến. . . . . . . . . . . 2.6 2.2 Dàn cho chương trình phân tích biểu thức bận rộn. . . . . . . . . . . 2.9 2.3 CFG của chương trình phân tích biểu thức bận rộn. . . . . . . . . . . 3.0 2.4 Dàn cho chương trình phân tích biểu thức có sẵn. . . . . . . . . . . . 3.4 2.5 CFG của chương trình phân tích biểu thức có sẵn. . . . . . . . . . . . 3.4 2.6 CFG của chương trình phân tích định nghĩa tới được. . . . . . . . . . 3.8 2.7 Đồ thị def-use định nghĩa tới được của các biến của chương trình. . . 4.0 2.8 Ví dụ CFG tổng quát cho chương trình có chứa lời gọi hàm. . . . . . 4.2 2.9 CFG của chương trình phân tích liên thủ tục. . . . . . . . . . . . . . 4.3 2.10 CFG đơn biến. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.4 2.11 CFG đa biến. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.5 3.1 Tổng quan về luồng làm việc của SOOT [10] . . . . . . . . . . . . . 4.8 3.2 Phương thức copy() và merge() trong SOOT . . . . . . . . . . . . . . 4.9 3.3 Kết quả phân tích với SOOT . . . . . . . . . . . . . . . . . . . . . . 5.1 MỞ ĐẦU Sự tiến hóa nhanh chóng của các thiết bị phần cứng trong hơn 30 năm qua đã đưa đến hệ quả về sự phát triển theo cấp số nhân của kích cỡ các chương trình phần mềm chạy trên đó. Quy mô của những ứng dụng cực lớn này (khoảng từ 1 tới 40 triệu dòng mã lệnh) vẫn tiếp tục gia tăng trong thời gian tới. Những phần mềm như thế cần phải được thiết kế với chi phí vừa phải trong khi vẫn phải bảo trì, nâng cấp trong toàn bộ vòng đời của chúng, tầm 20 năm. Một thực tế là quy mô và hiệu quả của những nhóm lập trình và bảo trì chúng không thể tăng theo tỉ lệ như vậy. Với hoàn cảnh đó, tỉ lệ giả định 1 lỗi trong 1000 dòng lệnh đối với những phần mềm như vậy là quá lạc quan và sẽ không thể đạt được trong những hệ thống đòi hỏi độ an toàn cực cao. Do đó, vấn đề về độ tin cậy của phần mềm (software reliability) chắc chắn là một mối quan tâm và thách thức đối với xã hội hiện đại ngày càng phụ thuộc vào các dịch vụ do máy tính đem lại. Nhiều kỹ thuật kiểm chứng phần mềm (software verification) và các công cụ hỗ trợ đi kèm đã được phát triển để thực thi hoặc giả lập chương trình trên nhiều môi trường khác nhau. Tuy nhiên, gỡ rối mã dịch hoặc giả lập mô hình của mã nguồn các chương trình không thể mở rộng quy mô và thường chỉ xét được mức độ bao phủ hạn chế các hành vi động của chương trình. Các phương pháp hình thức trong kiểm chứng chương trình (formal methods) cố gắng chứng minh một cách tự động rằng chương trình sẽ thực thi đúng đắn trên mọi môi trường được đặc tả. Mảng nghiên cứu này bao gồm các phương pháp suy dẫn (deductive 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). Ba nhóm đầu tập trung vào việc kiểm chứng phần mềm tại mức mô hình, trong khi nhóm cuối cùng xử lý phần mềm tại mức mã nguồn. Phân tích chương trình tĩnh thu hút sự quan tâm nhất do nền tảng lý thuyết hình thức của nó cũng như mục đích của nó đối với các ứng dụng của nó trong thực tế. Kỹ thuật này phát hiện tính chất/hành vi của một chương trình mà không yêu cầu chạy chương trình đó. Ngoài ra, một số lỗi chương trình như việc khởi tạo/sử dụng biến chương trình, biến con trỏ NULL, có thể được phát hiện bởi kỹ thuật này. Mục tiêu chính của luận văn là cập nhật được những xu thế trên thế giới trong lĩnh vực phân tích chương trình và cải tiến những kỹ thuật này. Cụ thể, luận văn tập trung vào nghiên cứu kỹ thuật phân tích chương trình dựa trên đồ thị luồng dữ liệu để nâng cao chất lượng phần mềm. Tiến hành thực nghiệm trên công cụ SOOT, một công cụ mã nguồn mở phân tích chương trình viết bằng Java trên môi trường tích hợp phát triển Eclipse. Cấu trúc của luận văn bao gồm: Chương 1 giới thiệu tổng quan về phân tích chương trình tĩnh. Trong chương này, trình bày định nghĩa kỹ thuật phân tích chương trình tĩnh, ứng dụng kỹ thuật phân tích, điểm mạnh và những hạn chế của kỹ thuật phân tích tĩnh. Và phần chính trong Chương 1 là phần kiến thức nền tảng chính sử dụng trong kỹ thuật phân tích chương trình tĩnh. Tiếp theo là Chương 2 trình bày về phân tích luồng dữ liệu. Cụ thể, trình bày phương pháp phân tích luồng dữ liệu trong một hàm không có chứa lời gọi hàm (nội thủ tục) và phân tích luồng dữ liệu đồ thị luồng dữ liệu cho cả chương trình với lời gọi hàm (liên thủ tục). Chương 3 trình bày phần thực nghiệm với SOOT - một công cụ nguồn mở để phân tích chương trình viết bằng Java trên môi trường tích hợp phát triển là Eclipse. Cuối cùng là phần kết luận và các tài liệu tham khảo. Chương 1 Giới thiệu 1.1. Giới thiệu về phân tích chương trình Phân tích chương trình tĩnh là kỹ thuật xác định tính chất/hành vi của một chương trình mà không cần phải chạy chương trình đó. Phân tích tĩnh được xây dựng dựa trên lý thuyết diễn giải trừu tượng (abstract interpretation) [5, 6] để chứng minh tính chính xác của các phân tích liên quan đến ngữ nghĩa của một ngôn ngữ lập trình. Có rất nhiều câu hỏi thú vị mà có thể được hỏi về một chương trình hoặc các điểm (point) riêng lẻ trong chương trình như: • Chương trình có dừng hay không? • Độ lớn có thể của vùng nhớ (heap) trong khi chạy? • Đầu ra (output) có thể là gì? • Biến x có luôn luôn cùng giá trị không? • Giá trị của x sẽ được đọc trong tương lai? • Con trỏ p null? • Biến x đã được khởi tạo trước khi đọc không? • v.v Theo lý thuyết Rice [14], tất cả các câu hỏi trên về hành vi của chương trình là không thể quyết định/chứng minh được (undecidable). Thay vì mức mô hình như nhiều phương pháp hình thức, luận văn hướng tới việc phân tích chương trình tĩnh. Cụ thể, luận văn trình bày một kỹ thuật để cải tiến mã chương trình và phát hiện các lỗi tiềm năng bằng việc phân tích chương trình tĩnh dựa trên phân tích luồng dữ liệu. 1.2. Điểm mạnh và điểm yếu Phân tích chương trình tĩnh có những ưu điểm sau: • Chỉ ra lỗi tại vị trí chính xác trong chương trình • Dễ dàng thực hiện bởi những chuyên gia kiểm định chất lượng phần mềm hiểu rõ về mã nguồn • Khoảng thời gian ngắn từ lúc phát hiện tới khi sửa lỗi • Có thể tự động hóa nhanh (thông qua các bộ công cụ hỗ trợ ví dụ: SOOT, Astree, TVLA, ) • Lỗi được phát hiện sớm trong qui trình phát triển phần mềm nên chi phí sửa lỗi thấp. Tuy nhiên, điểm yếu của kỹ thuật này xuất hiện khi tại một câu lệnh xuất hiện những tham chiếu, ràng buộc nằm ngoài phạm vi suy luận biểu trưng của chương trình. Hạn chế này là bản chất của việc phân tích tĩnh - không chạy với dữ liệu cụ thể. Một số điểm yếu không khắc phục được: • Mất thời gian nếu phải thực hiện bằng tay • Việc tự động hóa chỉ hướng vào một ngôn ngữ lập trình (ví dụ: SOOT chỉ kiểm tra mã nguồn chương trình viết bằng ngôn ngữ Java) • Thiếu nhân lực có thể hiểu và phân tích được chương trình • Có thể sinh ra nhiều lời cảnh báo lỗi không chính xác • Không phát hiện được lỗi chỉ xuất hiện khi chạy chương trình (run-time er- ror). 1.3. Các công nghệ phân tích chương trình tĩnh Những kỹ thuật phân tích chương trình tĩnh đã và đang thu hút nhiều nghiên cứu trên thế giới, hiện có nhiều kỹ thuật nhưng tựu chung có thể phân theo 4 nhóm chính như sau: Thứ nhất, kỹ thuật phân tích chương trình tĩnh dựa trên phân tích luồng dữ liệu (data flow analysis) [11, 15]. Phân tích luồng dữ liệu là một quá trình thu thập thông tin về dữ liệu trong các đoạn mã đó được thực thi trong thực tế trong chương trình mà không cần phải chạy đoạn mã đó. Tuy nhiên, phân tích luồng dữ liệu không sử dụng thao tác dựa trên ngữ nghĩa. Phân tích luồng dữ liệu là một cách rất hiệu quả và khả thi trong việc phát hiện lỗi chương trình và tối ưu hóa trong các trình biên dịch. Thứ hai, nhóm kỹ thuật liên quan tới xấp xỉ ngữ nghĩa được gọi là diễn giải trừu tượng (abstract interpretation) [5, 6]. Kỹ thuật diễn giải trừu tượng dựa trên nguyên tắc xấp xỉ ngữ nghĩa của chương trình khi kiểm tra đối chiếu sự thỏa mãn đặc tả. Kỹ thuật này trích ra từ một ngữ nghĩa chuẩn (standard semantics) được một ngữ nghĩa trừu tượng đã xấp xỉ và tính toán được (approximate and computable abstract semantics). Quá trình chuyển này không hoàn toàn tự động mà có thể cần sự tương tác với người dùng. Trong thực tế, kỹ thuật diễn giải trừu tượng có một thành phần là bộ sinh (generator) ngữ nghĩa trừu tượng đọc mã nguồn chương trình và tạo ra các ràng buộc hoặc hệ các phương trình cần được giải bởi máy tính thông qua một thành phần khác là bộ giải (solver). Một phương pháp phổ biến là dùng hàm lặp khi giải. 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). Các kỹ thuật liên quan tới việc tăng tốc hội tụ cũng được nghiên cứu. Thứ ba, nhóm kỹ thuật liên quan tới mô hình được gọi là kỹ thuật kiểm chứng mô hình (Model checking) [4]. Mô hình (model) của một hệ thống là một cách biểu hiện ở mức trừu tượng cao hơn của hệ thống bằng cách lược bỏ những phần quá chi tiết mà vẫn giữ lại những thông tin cần thiết về hệ thống đang được xem xét. Trong lĩnh vực phần mềm, kiểm chứng mô hình là cách kiểm tra xem liệu mô hình của một hệ thống (phần cứng hay phần mềm) thỏa mãn một tính chất nào đó hay không. Những đặc tả tính chất đó thường là những tính chất an toàn như khả năng không tồn tại những khóa chết (deadlock) hoặc rơi vào những trạng thái nguy hiểm tạo sự cố cho hệ thống. . . Nếu một hệ thống không thoả mãn một tính chất thì kiểm chứng mô hình sẽ đưa ra phản ví dụ với một xâu các trạng thái và sự kiện liên quan bắt đầu từ trạng thái ban đầu tới trạng thái lỗi của mô hình. Cuối cùng, kỹ thuật phân tích biểu trưng (symbolic analysis) [18]. Kỹ thuật này là phân tích tĩnh mã nguồn tĩnh, xây dựng các luồng rẽ nhánh trong chương trình dựa trên các nút. Tại các nút tương ứng sẽ là tập hợp các ràng buộc (con- straints) của dữ liệu, biến, tham số. Tại nút khởi tạo chương trình, tập hợp các ràng buộc là rỗng. Càng đi sâu xuống các nhánh nhỏ, tại các nút con, tập hợp ràng buộc sẽ được tạo ra từ tập hợp ràng buộc tại nút ngay phía trên cộng với điều kiện giữa các biến số để có thể rẽ từ nút trên vào nút dưới trong luồng chảy chương trình. Điểm đặc biệt của kỹ thuật này là các tham số hoàn toàn được thể hiện bằng ký tự biểu trưng, chứ không phải giá trị cụ thể. Ý tưởng của phương pháp này là để kiểm thử một nhánh trong chương trình, điều kiện tiên quyết là dữ liệu tại đầu vào phải thỏa mãn tập hợp các ràng buộc tại nút bắt đầu nhánh đó. Việc giải các ràng buộc gắn với một nút được thực hiện bởi các bộ công cụ sẵn có gọi là giải ràng buộc (constraint solver) dựa trên SMT (Satisfiability Modulo Theories) hay SAT (Satisfiability Testing). Hai nhóm đầu tập trung vào việc nâng cao chất lượng phần mềm tại mức mã nguồn, trong khi hai nhóm sau xử lý phần mềm tại mức trừu tượng cao hơn – mô hình. Luận văn sẽ tập trung vào xu thế thứ nhất, đó là kiểu phân tích luồng dữ liệu dựa trên đồ thị luồng dữ liệu. 1.4. Nền tảng 1.4.1. Đồ thị luồng điều khiển Đồ thị luồng điều khiển (Control Flow Graph-CFG) là một đồ thị có hướng, trong đó các nút (node) tương ứng là các điểm (point) chương trình và các cạnh thể hiện cho luồng điểu khiển. Một CFG luôn luôn có một điểm của đầu vào, ký hiệu là entry, và một điểm của đầu ra, ký hiệu là exit. Ngoài ra, nếu v là một nút trong CFG thì những ký hiệu pred(v) là tập các nút kế trước (predecessor) và succ(v) là tập các nút kế sau (successor). CFG cho các lệnh • Các lệnh cơ bản Các lệnh đơn giản mà CFG có thể khởi tạo liên quan đến. Những CFG cơ bản trong ngôn ngữ lập trình Java như là các phép gán ( id = E;), output ( printf(E); ), lệnh return ( return; ), và khai báo biến (ví dụ int f; ) được môt tả trong Hình 1.1 bên dưới: [...]... một phần tử Độ phức tạp trường hợp xấu nhất không thay đổi, nhưng trong thực tế thuật toán này giúp tiết kiệm nhiều thời gian Chương 2 Phân tích chương trình tĩnh Trong chương này, luận văn giới thiệu kỹ thuật phân tích chương trình tĩnh dựa trên phân tích luồng dữ liệu trong hàm không có lời gọi hàm hay phân tích nội thủ tục (intraprocedual) và trong chương trình có chứa lời gọi hàm hay phân tích. .. f=1 uu_f = 0 n>0 f = f*n n=n-1 return f Hình 1.5: CFG của chương trình tính giai thừa 1.4.2 Lý thuyết Dàn Dàn Trong kỹ thuật phân tích chương trình tĩnh của luận văn, các phân tích sử dụng cấu trúc toán học là Dàn (Lattices) [16], tập các thuộc tính (ví dụ: tập các biến, biểu thức, trong chương trình) cần thiết cho mỗi phân tích tĩnh trong chương trình Định nghĩa Dàn Một thứ tự bộ phận (partial order)... với những chương trình phức tạp hơn thì lợi ích từ việc phân tích này có thể rất lớn trong tính toán của bộ nhớ và tối ưu hóa trong xử lý thông qua bộ chương trình dịch thông minh Phân tích biểu thức bận rộn Việc tính toán các biểu thức trong chương trình làm tăng bộ nhớ và làm chậm thời gian chạy kết quả của chương trình Do vậy, trong chương trình nếu hạn chế tính toán lại một biểu thức trong tương... phương trình chỉ phụ thuộc vào các nút kế sau nó (successor) trên CFG Phân tích lùi được bắt đầu từ nút exit của CFG và di chuyển quay lại trong CFG Một số phân tích điển hình: Phân tích tính sống của biến (Liveness), phân tích biểu thức bận rộn (Busy Expression) Phân tích tính sống của biến Trong một chương trình việc xác định tính sống của biến tại mỗi điểm của chương trình là rất cần thiết, việc này... tục (interprocedure) 2.1 Phân tích luồng dữ liệu nội thủ tục Phân tích luồng dữ liệu hay còn gọi là khung đơn điệu (monotone framework), là kỹ thuật phân tích chương trình tĩnh nhằm thu thập các hành vi của chương trình và phát hiện lỗi thông qua đồ thị luồng dữ liệu (CFG) và Dàn L có độ cao hữu hạn Các bước để phân tích luồng dữ liệu bao gồm: • Bước 1: Khởi tạo CFG của chương trình: Gọi V = v1 , v2... Giải hệ phương trình các ràng buộc thông qua thuật toán tìm điểm cố định (Mục 1.4.3): F(x1 , , xn ) = (F1 (x1 , , xn ), , Fn (x1 , , xn )) Nghiệm nhỏ nhất thu được sẽ được dùng để kết luận cho phân tích chương trình 2.1.1 Phân tích quay lại (backward) Với mỗi điểm của chương trình (nút trên CFG), phân tích quay lại (backward analysis) là phân tích thông tin về hành vi trong tương lai Do đó, trong vế phải... phải của các phương trình chỉ phụ thuộc vào các nút kế trước nó (predecessor) trên CFG Phân tích tiến được bắt đầu từ nút entry của CFG và di chuyển chuyển tiếp trong CFG Một số phân tích điển hình: Phân tích biểu thức có sẵn(Available Expression), phân tích định nghĩa tới được(Reaching Denitions) Phân tích biểu thức có sẵn Một biểu thức không bình thường (nontrivial) trong một chương trình là có sẵn (available)... đến điểm chương trình sớm nhất mà nó là rất bận rộn Điều này sẽ làm thay đổi chương trình trở nên hiệu quả hơn: int func(int x){ int a,b,t; a = x-1; b = x-2; t = a*b; while (x>0){ return t-x; x = x-1; } return t; } 2.1.2 Phân tích chuyển tiếp (forward) Với mỗi điểm của chương trình (nút trên CFG), phân tích chuyển tiếp (forward analysis) là phân tích thông tin về hành vi trong quá khứ Do đó, trong vế... (available) tại một điểm trong chương trình nếu giá trị của nó đã được tính toán sẵn trước đó trong khi thực thi Việc xác định các biểu thức đã có sẵn trước khi thực thi sẽ giúp cho việc tính toán nhanh và đơn giản hơn Do vậy, trong phân tích này chúng ta sử dụng các thông tin về hành vi trong quá khứ Và, Dàn cho phân tích này là tập hợp các biểu thức xảy ra cho tất cả các điểm chương trình và được sắp bởi... giúp chương trình xác định và loại bỏ được các biến chết giúp tối ưu hóa bộ nhớ/ tối ưu hoá chương trình dịch và làm tăng tốc độ tính toán của chương trình Một biến được gọi là biến sống tại một điểm của chương trình (liveness) nếu giá trị hiện tại của nó được đọc trong nút hiện tại hoặc được đọc trong một số nút kế tiếp (không được ghi ở nút hiện tại) Thuộc tính này có thể được xấp xỉ bởi phân tích tĩnh . chế của kỹ thuật phân tích tĩnh. Và phần chính trong Chương 1 là phần kiến thức nền tảng chính sử dụng trong kỹ thuật phân tích chương trình tĩnh. Tiếp theo là Chương 2 trình bày về phân tích. luận văn bao gồm: Chương 1 giới thiệu tổng quan về phân tích chương trình tĩnh. Trong chương này, trình bày định nghĩa kỹ thuật phân tích chương trình tĩnh, ứng dụng kỹ thuật phân tích, điểm mạnh. giới trong lĩnh vực phân tích chương trình và cải tiến những kỹ thuật này. Cụ thể, luận văn tập trung vào nghiên cứu kỹ thuật phân tích chương trình dựa trên đồ thị luồng dữ liệu để nâng cao chất

Ngày đăng: 21/07/2014, 09:18

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan