TÓM TẮT LUẬN VĂN 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

24 660 0
TÓM TẮT LUẬN VĂN 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

ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ TRẦN MẠNH ĐƠNG 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 Ngành: Công nghệ thông tin Chuyên ngành: Công nghệ phần mềm Mã số: 60 48 10 TÓM TẮT LUẬN VĂN THẠC SĨ CÔNG NGHỆ THÔNG TIN Hà Nội – 2013 MỞ ĐẦU Sự tiến hóa nhanh chóng thiết bị phần cứng 30 năm qua đưa đến hệ phát triển theo cấp số nhân kích cỡ chương trình phần mềm chạy Quy mơ ứng dụng cực lớn (khoảng từ tới 40 triệu dòng mã lệnh) tiếp tục gia tăng thời gian tới Những phần mềm cần phải thiết kế với chi phí vừa phải phải bảo trì, nâng cấp tồn vịng đời chúng, tầm 20 năm Một thực tế quy mô hiệu nhóm lập trình bảo trì chúng khơng thể tăng theo tỉ lệ Với hồn cảnh đó, tỉ lệ giả định lỗi 1000 dòng lệnh phần mềm lạc quan đạt hệ thống địi hỏi độ an tồn cực cao Do đó, vấn đề độ tin cậy phần mềm (software reliability) chắn mối quan tâm thách thức xã hội đại ngày phụ thuộc vào dịch vụ máy tính đem lại Nhiều kỹ thuật kiểm chứng phần mềm (software verification) công cụ hỗ trợ kèm phát triển để thực thi giả lập chương trình nhiều mơi trường khác Tuy nhiên, gỡ rối mã dịch giả lập mơ hình mã nguồn chương trình khơng thể mở rộng quy mô thường xét mức độ bao phủ hạn chế hành vi động chương trình Các phương pháp hình thức kiểm chứng chương trình (formal methods) cố gắng chứng minh cách tự động chương trình thực thi đắn môi trường đặc tả Mảng nghiên cứu bao gồm 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) 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 mức mơ hình, nhóm cuối xử lý phần mềm mức mã nguồn Phân tích chương trình tĩnh thu hút quan tâm tảng lý thuyết hình thức mục đích ứng dụng thực tế Kỹ thuật phát tính chất/hành vi chương trình mà khơng u cầu chạy chương trình Ngồi ra, số lỗi chương trình việc khởi tạo/sử dụng biến chương trình, biến trỏ NULL, phát kỹ thuật Chương 1: Giới thiệu 1.1 Giới thiệu phân tích chương trình Phân tích chương trình tĩnh kỹ thuật xác định tính chất/hành vi chương trình mà khơng cần phải chạy chương trình Phân tích tĩnh xây dựng dựa lý thuyết diễn giải trừu tượng (abstract interpretation) để chứng minh tính xác phân tích liên quan đến ngữ nghĩa ngơn ngữ lập trình 1.2 Điểm mạnh điểm yếu Phân tích chương trình tĩnh có ưu điểm sau: • Chỉ lỗi vị trí xác chương trình • Dễ dàng thực chuyên gia kiểm định chất lượng phần mềm hiểu rõ mã nguồn • Khoảng thời gian ngắn từ lúc phát tới sửa lỗi • Có thể tự động hóa nhanh (thơng qua cơng cụ hỗ trợ ví dụ: SOOT, Astree, TVLA, ) • Lỗi phát sớm qui trình phát triển phần mềm phí sửa lỗi thấp 3 Một số điểm yếu khơng khắc phục được: • Mất thời gian phải thực tay • Việc tự động hóa hướng vào ngơn ngữ lập trình (ví dụ: SOOT kiểm tra mã nguồn chương trình viết ngơn ngữ Java) • Thiếu nhân lực hiểu phân tích chương trình • Có thể sinh nhiều lời cảnh báo lỗi khơng xác • Khơng phát lỗi xuất chạy chương trình (run-time error) 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 thu hút nhiều nghiên cứu giới, có nhiều kỹ thuật tựu chung phân theo nhóm sau: - Kỹ thuật phân tích chương trình tĩnh dựa phân tích luồng liệu (data flow analysis) - Kỹ thuật liên quan tới xấp xỉ ngữ nghĩa gọi diễn giải trừu tượng (abstract interpretation) - Kỹ thuật liên quan tới mơ hình gọi kỹ thuật kiểm chứng mơ hình (Model checking) - Kỹ thuật phân tích biểu trưng (symbolic analysis) Hai nhóm đầu tập trung vào việc nâng cao chất lượng phần mềm mức mã nguồn, hai nhóm sau xử lý phần mềm mức trừu tượng cao – mô hình Luận văn tập trung vào xu thứ nhất, kiểu phân tích luồng liệu dựa đồ thị luồng 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) đồ thị có hướng, nút tương ứng điểm chương trình cạnh thể cho luồng điểu khiển Một CFG ln ln có điểm vào, ký hiệu entry, điểm ra, ký hiệu exit Ngoài ra, v nút CFG ký hiệu pred(v) tập nút kế trước (predecessor) succ(v) tập nút kế sau (successor) CFG cho lệnh • Các lệnh id = E printf(E) return E int id Hình 1: CFG cho lệnh • Các lệnh S1 S1 S2 S2 Hình 2: CFG cho lệnh • Các lệnh cấu trúc điều khiển E S if(E) S; E S1 S2 if(E) S1; else S2; Hình 3: CFG cho lệnh if, if-else E1 E2 E S S while(E) S; E3 for(E1; E2; E3;) S; Hình 4: CFG cho lệnh while, for Ví dụ CFG chương trình Sử dụng cách xây dựng CFG cho lệnh trên, ta xây dựng CFG cho ví dụ chương trình hàm tính giai thừa viết ngôn ngữ Java: int iterative(int n) { int f;// khai báo biến (f kiểu int) int uu_f; f = 1; uu_f = 0;// biến không biến sống while (n > 0){ f = f*n; n = n - 1; } return f; } Và biểu diễn thành CFG sau: int f int uu_f f=1 uu_f = n>0 f = f*n n=n-1 return f Hình 5: CFG chương trình tính giai thừa 1.4.2 Lý thuyết Dàn Định nghĩa Dàn Một thứ tự phận (partial order) cấu trúc toán học: L = (S , ⊑), với S tập ⊑ quan hệ hai tập S , thỏa mãn điều kiện sau: • Phản xạ: ∀x ∈ S : x ⊑ s • Phản xứng: ∀x, y ∈ S : x ⊑ y ∧ y ⊑ x ⇒ x = y • Bắc cầu: ∀x, y, z ∈ S : x ⊑ y ∧ y ⊑ z ⇒ x ⊑ z Biểu diễn Dàn thơng qua biểu đồ Hasse Ví dụ, biểu diễn Dàn (2{x,y,x} , ⊆) (Hình (a)) Dàn đảo ngược (Dàn thứ tự ngược tập quan hệ hai ⊑ định nghĩa ⊇) (2{x,y,x} , ⊇) (Hình (b)) biểu đồ Hasse: {x,y,z} {} {x,y} {x,z} {y,z} {x} {y} {z} {x} {y} {z} {x,y} {x,z} {y,z} {} {x,y,z} (a) (b) Hình 6: Biểu đồ Hasse biểu diễn Dàn Cận trên, cận Cho X ⊆ S Ta nói y ∈ S cận X, ký hiệu X ⊑ y, ∀x ∈ X : x ⊑ y Tương tự, y ∈ S cận X, ký hiệu y ⊑ X, ∀x ∈ X : y ⊑ x Một cận nhỏ nhất, ký hiệu ⊔X, định nghĩa bởi: X ⊑ ⊔X ∧ ∀y ∈ X : X ⊑ y ⇒ ⊔X ⊑ y Bên cạnh đó, cận lớn nhất, ký hiệu ⊓X, định nghĩa bởi: ⊓X ⊑ X ∧ ∀y ∈ X : y ⊑ X ⇒ y ⊑ ⊓X Một Dàn thứ tự phận ⊔X ⊓X tồn cho tất X ⊆ S Phần tử lớn nhất, phân tử nhỏ Nếu x = ⊔X ∈ X x gọi phần tử lớn X, ký hiệu ⊤ định nghĩa ⊤ = ⊓S Từ tính phản xạ quan hệ thứ tự ta suy ⊤ tồn Tương tự ta có, y = ⊓X ∈ X y gọi phần tử nhỏ X, ký hiệu ⊥ định nghĩa ⊥ = ⊔S Từ tính phản xạ quan hệ thứ tự ta suy ⊥ tồn Do tính phần tử ⊤ ⊥ Độ cao dàn Độ cao Dàn tính chiều dài từ phần tử nhỏ ⊥ tới phần tử lớn ⊤ Dàn L = (S , ⊑) hữu hạn (chiều cao Dàn hữu hạn) tập S chứa hữu hạn số phần tử Điểm cố định (Fixed-Point) Hàm đơn điệu Ánh xạ f : L → L gọi hàm đơn điệu ∀x, y ∈ S : x ⊑ y ⇒ f (x) ⊑ f (y) Chú ý thuộc tính khơng có nghĩa hàm f hàm tăng (∀x ∈ S : x ⊑ f (x)); Ví dụ, tất hàm hàm đơn điệu, hàm ⊔ ⊓ đơn điệu hai trường hợp Lưu ý phép hợp hàm đơn điệu hàm đơn điệu 9 Điểm cố định Điều mà ta cần việc tìm điểm cố định hàm Theo lý thuyết điểm cố định [? ], Dàn L với độ cao hữu hạn, hàm đơn điệu f có điểm cố định nhỏ định nghĩa: ⊔ f ix( f ) = f i (⊥) i≥0 Thuộc tính đóng Nếu L1 , L2 , , Ln Dàn với độ cao hữu hạn, từ phép tốn tích (product): L1 × L2 × × Ln = {(x1 , x2 , , xn )|xi ∈ L1 } Tương tự ta có, phép tốn cộng (sum): L1 + L2 + + Ln = {(i, xi )|xi ∈ Li \ {⊥, ⊤}} ∪ {⊥, ⊤} Nếu Dàn L Dàn với độ cao hữu hạn, li f t(L), độ cao Dàn L là: height(li f t(L)) = height(L) + Nếu A tập hữu hạn (A không cần thiết phải Dàn), f lat(A) Dàn Cuối cùng, A L định nghĩa trên, thu Dàn ánh xạ (map) với độ cao sau: A → L = {[a1 x1 , , an → xn ]|xi ∈ L} Phương trình bất phương trình Cho L Dàn với độ cao hữu hạn Một hệ phương trình biểu diễn: x1 = F1 (x1 , , xn ) x2 = F2 (x1 , , xn ) xn = Fn (x1 , , xn ) 10 với xi biến Fi : Ln → L tập hàm đơn điệu Mỗi hệ có nghiệm nhỏ nhất, gọi điểm cố định nhỏ hàm F : Ln → L định nghĩa bởi: F(x1 , x2 , , xn ) = (F1 (x1 , x2 , , xn ), , Fn (x1 , x2 , , xn )) 1.4.3 Thuật toán điểm cố định Thuật toán lặp chaotic x1 = ⊥; xn = ⊥; { t1 = x1 ; tn = xn ; x1 = F1 (x1 , , xn ); xn = Fn (x1 , , xn ); } while (x1 t1 ∨ ∨ xn tn ); Thuật toán work-list x1 = ⊥; xn = ⊥; W = {1, , n}; while (W ∅) { i = W.removeNext(); y = Fi(x1 , , xn ); if (y xi ) { for (v j ∈ dep(vi ))W.add( j); xi = y; } } Chương 2: Phân tích chương trình tĩnh 2.1: Phân tích luồng liệu nội thủ tục Phân tích luồng liệu hay gọi khung đơn điệu (monotone framework), kỹ thuật phân tích chương trình tĩnh nhằm thu thập hành vi chương trình phát 11 lỗi thông qua đồ thị luồng liệu (CFG) Dàn L có độ cao hữu hạn Các bước để phân tích luồng liệu bao gồm: • Bước 1: Khởi tạo CFG chương trình: Gọi V = v1 , v2 , tập nút CFG • Bước 2: Khởi tạo Dàn hữu hạn L thông qua tập biến, biểu thức chương trình • Bước 3: Xây dựng hệ phương trình ràng buộc luồng liệu chương trình: với nút v CFG ta gán biến v ∈ L, với khởi tạo ngôn ngữ lập trình, mơt kết hợp ràng buộc luồng liệu (dataflow constraint) xác định liên quan đến giá trị biến nút tương với nút khác, đặc biệt nút láng giếng 2.2.1 Phân tích quay lại (backward) Với điểm chương trình (nút CFG), phân tích quay lại (backward analysis) phân tích thơng tin hành vi tương lai Do đó, vế phải phương trình phụ thuộc vào nút kế sau (successor) CFG Phân tích lùi nút exit CFG di chuyển quay lại CFG Một số phân tích điển hình: Phân tích tính sống biến (Liveness), phân tích biểu thức bận rộn (Busy Expression) Với điểm chương trình (nút CFG), phân tích quay lại (backward analysis) phân tích thơng tin hành vi tương lai Do đó, vế phải phương trình phụ thuộc vào nút kế sau (successor) CFG Phân tích lùi nút exit CFG di chuyển quay lại CFG Một số phân tích điển hình: Phân tích tính sống 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 biến Trong chương trình việc xác định tính sống biến điểm chương trình cần thiết, việc giúp chương trình 12 xác định loại bỏ biến chết giúp tối ưu hóa nhớ/ tối ưu hố chương trình dịch làm tăng tốc độ tính tốn chương trình Một biến gọi biến sống điểm chương trình (liveness) giá trị đọc nút đọc số nút (không ghi nút tại) Thuộc tính xấp xỉ phân tích tĩnh dựa CFG với dàn tập biến chương trình Gọi biến ràng buộc cho nút v CFG v , ràng buộc cho tính sống biến nút với cấu trúc lệnh chương trình xác định sau: – Đối với nút exit, có ràng buộc là: exit = ∅ – Đối với lệnh điều kiện, lệnh return lệnh printf(E), ràng buộc là: ∪ v = w ∪ vars(E) w∈succ(v) – Đối với phép gán id = E, ràng buộc là: ∪ v = w \ {id} ∪ vars(E) w∈succ(v) – Đối với khai báo biến intid1 , , idn , ràng buộc là: ∪ v = w \ {id1 , , idn } w∈succ(v) – Cuối cùng, nút khác, ràng buộc là: ∪ v = w w∈succ(v) Hàm vars(E) tập biến E vế phải ràng buộc hàm đơn điệu Với quan sát CFG chương trình, biến sống đọc nút tại, đọc số nút trừ ghi nút Xét ví dụ Mục 1.4.1, dàn L = (2{f, uu_f, n} , ⊆) Các ràng buộc tạo sau: 13 entry = int f int f = int uu_f \ {f} int uu_f = f = \ {uu_f} f = = uu_f = \ {f} uu_f = = n > \ {uu_f} n > = ( return f ∪ f = f*n ) ∪ {n} return f = exit ∪ {f} f = f*n = ( n = n-1 \ {f}) ∪ {n,f} n = n-1 = ( n > \ {n}) ∪ {n} exit = ∅ Hệ phương trình để giải thông qua Dàn: L = (2{f, uu_f, n} , ⊆ ) Hơn nữa, dễ dàng thấy tất vế phải ràng buộc phương trình định nghĩa hàm đơn điệu Theo kết quả, lý thuyết điểm cố định nhỏ áp dụng [? ] Nghiệm nhỏ cho hệ phương trình (Được giải Phụ lục A) là: entry = ∅ int f = ∅ int uu_f = ∅ f = = {n} uu_f = = {n,f} n > = {n,f} return f = {f} f = f*n = {n,f} n = n-1 = {n,f} exit = ∅ Phân tích biểu thức bận rộn Việc tính tốn biểu thức chương trình làm tăng nhớ làm chậm thời gian chạy kết chương trình Do vậy, chương trình hạn chế tính tốn lại biểu thức tương lai giúp chương trình chạy nhanh giúp nhớ tối ưu 14 Một biểu thức E bận rộn (busy) điểm p chương trình tất đường (path) xuất phát từ điểm chương trình p phải đánh giá E trước biến biểu thức E thay đổi Hoặc, ta hiểu giá trị biểu thức đánh giá thời điểm đánh giá tất nút tương lai trừ phép gán làm thay đổi giá trị Để xấp xỉ thuộc tính này, ta cần Dàn tập biểu thức chương trình Đối với phân tích này, ta xác định ràng buộc luồng liệu cho cấu trúc lệnh sau: – Ràng buộc cho lệnh exit: exit = {} – Các ràng buộc cho lệnh điều kiện output là: ∩ v = w ∪ exps(E) w∈succ(v) – Ràng buộc cho phép gán là: ∩ w ↓ id ∪ exps(E) v = w∈succ(v) – Với tất nút cịn lại có ràng buộc là: ∩ v = w w∈succ(v) 2.1.2 Phân tích chuyển tiếp (forward) Với điểm chương trình (nút CFG), phân tích chuyển tiếp (forward analysis) phân tích thơng tin hành vi khứ Do đó, vế phải phương trình phụ thuộc vào nút kế trước (predecessor) CFG Phân tích tiến nút entry CFG di chuyển chuyển tiếp 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) 15 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 Do vậy, phân tích sử dụng thông tin hành vi khứ Và, 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ới biến ràng buộc v Dàn L chứa tập biểu thức mà đả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 Phân tích đưa bảo tồn kể từ thiết lập tính tốn nhỏ Từ đó, có ràng buộc luồng liệu cho cấu trúc lệnh phân tích sau: – Với nút entry ta có ràng buộc: entry = {} – Nếu v chứa điều kiện E lệnh output E, ràng buộc là: ∩ v = w ∪ exps(E) w∈pred(v) – Nếu v chứa phép gán id = E, ràng buộc là: v =( ∩ w∈pred(v) w ∪ exps(E)) ↓ id – Đối với tất lệnh khác nút, có ràng buộc là: v = ∩ w∈pred(v) w 16 Với hàm ↓ id loại bỏ tất biểu thức có chứa tham chiếu đến biến id, hàm exps định nghĩa là: exps(intconst) = ∅ exps(id) = ∅ exps(input) = ∅ exps(E1 opE2 ) = {E1 opE2 } ∪ exps(E1 ) ∪ exps(E2 ) 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 Phân tích định nghĩa tới Trong lĩnh vực kiểm thử đảm bảo chất lượng phần mềm, việc xác định đồ thị def-use việc làm quan trọng việc hạn chế mã chết (dead code) mã chuyển động (code motion) Vì vậy, mục đích kỹ phân tích định nghĩa tới xác định mối quan hệ biến có điểm chương trình với Các định nghĩa tới (reaching denitions) cho điểm chương trình phép gán mà xác định giá trị biến Đối với phân tích này, cần dàn tập tất phép gán xảy chương trình Với nút v CFG biến v tập phép gán mà xác định giá trị biến điểm chương trình Ta có ràng buộc cho lệnh chương trình phân tích sau: – Với phép gán có ràng buộc: ∪ v =( w ) ↓ id ∪ {v} w∈pred(v) 17 – Với tất nút khác, ràng buộc là: ∪ v = w w∈pred(v) Trong đó, hàm ↓ id loại bỏ tất phép gán chứa biến id 2.2 Phân tích luồng liệu liên thủ tục Trong phân tích liên thủ tục, vấn đề luận văn tiếp cận việc xây dựng CFG cho tồn chương trình, xem xét tính nhạy cảm luồng liệu (sensitivity) ứng dụng kỹ thuật phân tích 2.2.1 Xây dựng đồ thị luồng liệu Để xây dựng CFG cho chương trình liên thủ tục, ta giả sử có tập hợp biến ẩn (shadow) sau: – Với hàm f ta đặt biến ret − f tương ứng cho giá trị trả hàm; – Với lệnh gọi hàm chương trình đặt biến call − i, i mục biểu thị giá trị tính tốn lời gọi hàm; – Với biến cục tham số thức x hàm gọi cho câu lệnh gọi hàm, biến save − i − x để bảo tồn giá trị biến trước thực việc gọi hàm; – Cuối cùng, cho tham số thức x hàm bị gọi điểm gọi, giới thiệu biến tạm temp − i − x Để đơn giản, ta giả định tất lời gọi hàm thực kết nối với tham số: x = f (E1 , , En ) Bây giờ, xem xét CFG cho lời gọi hàm gọi, tham số thức hàm gọi a1 , , an hàm bị gọi b1 , , bm , lời gọi hàm chuyển thành đồ thị sau: int f() { int x; x=test(20) return x; } int g() { int y; y=test(10) return y; } int test(int z){ Một vấn đề quan tâm phân tích liên thủ tục phân tích ngữ cảnh phụ thuộc gọi hàm Đối với hàm gọi lần ta gọi đơn biến (monovariant), hàm sử dụng nhiều lần gọi đa biến (polyvariant) Xét ví dụ cho phân tích đa biến cho chương trình sau: 2.2.2 Tính cảm ngữ cảnh (context sensitivity) Hình 7: Ví dụ CFG tổng qt cho chương trình có chứa lời gọi hàm call-i=ret-f; ret-f=E; 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 bj=save-i-bj; xj=save-i-xj; x=call-I; 000000000000000000000000000000000000000000000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 int x1,x2,…xk; save-i-bj=bj; save-i-xj=xj; temp-i-aj=Ej; aj=temp-i-aj; 18 19 return z+1; } Xây dựng CFG cho chương trình giới thiệu Mục 2.2.1 hình đây: int x int y save-1-x=x save-2-y=y z=20 z=10 call-1=ref-test ref -test=z call-2=ref-test save-1-x=x save-2-y=y x=call-1 y=call-2 ret-f=x ret-g=y Hình 8: CFG đơn biến Với cách xây dựng CFG, ta phân tích lan truyền số cách giá trị trả hai hàm f g bị sai hai gọi hàm test Để giải ngữ cảnh nhạy cảm này, ta sử dụng phân tích đa biến, tạo chép CFG hàm gọi cho lời gọi hàm Việc xác định số chép đơn giản lời gọi tạo chép sau: 20 int x save-1-x=x int y save-2-y=y z=20 call-1=ref-test call-2=ref-test save-1-x=x save-2-y=y x=call-1 y=call-2 ret-f=x ref -test=z z=10 ret-g=y ref -test=z Hình 9: CFG đa biến Tuy nhiên, hàm đệ quy số chép vơ hạn 2.2.3 Ứng dụng phân tích luồng liệu liên thủ tục Một ứng dụng cho phân tích liên thủ tục gọi rung (tree shaking), ứng dụng để xác định loại bỏ hàm không gọi hay hàm chết từ loại bỏ từ chương trình mà đảm bảo tính an tồn Điều thực hữu ích chương trình thực với thư viện hàm lớn Với CFG xây dựng phần trình bày, ta sử dụng Dàn tập tên hàm chương trình Với nút v CFG, đưa vào biến hạn chế v biểu thị tập hàm gọi đến tương lai Tiếp theo, sử dụng ký hiệu entry(id) cho nút vào (entry) hàm id Khi đó, ràng buộc: 21 • Cho phép gán, điều kiện output là: v = ∪ w∈succ(v) w ∪ f uncs(E) ∪ ∪ f ∈ f uncs(E) entry( f ) • Và cho trường hợp khác là: v = ∪ w w∈succ(v) Trong đó, hàm funcs định nghĩa sau: funcs(id) = f uncs(const) = f uncs(input) = ∅ funcs(E1 opE2 ) = f uncs(E1 ) ∪ f uncs(E2 ) funcs(id(E1 , , E2 )) = {id} ∪ f uncs(E1 ) ∪ ∪ f uncs(En ) Trong phân tích này, vế phải ràng buộc hàm đơn điệu Khi đó, với cách xây dựng CFG cho chương trình ràng buộc cho ứng dụng ta có hệ phương trình ràng buộc việc giải nghiệm cố định nhỏ (Mục ) để tìm hàm tất hàm không sử dụng chương trình Như vậy, ta loại bỏ hàm mà đảm bảo an toàn cho chương trình Chương 3: Thực nghiệm Trong phần thực nghiệm này, luận văn tiến hành dựa công cụ mã nguồn mở SOOT, hỗ trợ cho chương trình viết ngơn ngữ Java, plugin tích hợp vào Eclipse 3.1 Tổng quan SOOT SOOT framework tối ưu hóa cho Java nhóm nghiên cứu đại học McGill (Canada), năm 2000 Đây phần mềm nguồn mở Các bước phân tích SOOT • Bước 1: Cài đặt kiểu phân tích: BackwarkFlowAnalysis(), ForwarkFlowAnalysis() 22 • Bước 2: Cài đặt trừu tượng: merge(), copy() • Bước 3: Cài đặt hàm luồng: flowThrough() • Bước 4: Cài đặt khởi tạo giá trị: newInitialFlow() entryInitialFlow() • Bước 5: Xây dựng phân tích: doAnalysis() 3.2 Phân tích chương trình ví dụ với Soot Trong phần này, luận văn thực nghiệm với phân tích tính sống biến 23 KẾT LUẬN Phân tích chương trình tĩnh kỹ thuật thu hút quan tâm giới ứng dụng mang lại Trong q trình thực luận văn này, tơi tìm hiểu kiến thức tảng phân tích chương trình - khâu vơ quan trọng giúp phát lỗi tối ưu hóa chương trình để nhằm nâng cao chất lượng phần mềm Cụ thể, luận văn đạt trình bày tổng quan phân tích chương trình tĩnh Trong đó, nêu khái niệm liên quan đến phân tích chương trình tĩnh, điểm mạnh mặt yếu, kỹ thuật phân tích chương trình tĩnh giới học thuật nghiên cứu Tiếp theo lý thuyết tảng liên quan đến phân tích chương trình tĩnh cách xây dựng đồ thị luồng liệu, lý thuyết toán học lý thuyết Dàn, thuật toán tìm điểm cố định Từ kiến thức tảng đó, luận văn tiếp cận nghiên cứu kỹ thuật phân tích chương trình tĩnh mức mã nguồn, phân tích dựa phân tích luồng liệu Từ kết thu từ kỹ thuật phân tích giúp cho việc phân tích thuộc tính/hành vi xảy chương trình Cuối cùng, luận văn tiến hành thực nghiệm kỹ thuật phân tích tĩnh công cụ mã nguồn mở SOOT, sử dụng phân tích cho ngơn ngữ lập trình Java Tuy nhiên, việc phân tích tĩnh khó việc phân tích tĩnh dựa phân tích luồng liệu kỹ thuật đề cập khuôn khổ luận văn tốt nghiệp Trong tương lai, số vấn đề cần tiếp tục nghiên cứu phân tích khoảng, phân tích luồng điều khiển (phân tích trỏ) phát triển cơng cụ phân tích chương trình tĩnh cho ngôn ngữ khác C, C++, Java, nhằm tối ưu hóa chương trình dịch, giảm chi phí nâng cao chất lượng phần mềm ... thức tảng đó, luận văn tiếp cận nghiên cứu kỹ thuật phân tích chương trình tĩnh mức mã nguồn, phân tích dựa phân tích luồng liệu Từ kết thu từ kỹ thuật phân tích giúp cho việc phân tích thuộc tính/hành... luận văn đạt trình bày tổng quan phân tích chương trình tĩnh Trong đó, nêu khái niệm liên quan đến phân tích chương trình tĩnh, điểm mạnh mặt yếu, kỹ thuật phân tích chương trình tĩnh giới học thuật. .. Xây dựng phân tích: doAnalysis() 3.2 Phân tích chương trình ví dụ với Soot Trong phần này, luận văn thực nghiệm với phân tích tính sống biến 23 KẾT LUẬN Phân tích chương trình tĩnh kỹ thuật thu

Ngày đăng: 13/04/2015, 16:32

Từ khóa liên quan

Mục lục

  • TomTatLuanVan.pdf

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

  • Đang cập nhật ...

Tài liệu liên quan