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

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 662 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 24
Dung lượng 282,24 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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

Trang 2

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àycà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ênnhiề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ủachươ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

Trang 3

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ềntả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 vicủ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ươngtrình, biến con trỏ NULL, có thể được phát hiện bởi kỹ thuật này

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) để 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

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ượngphầ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ênchi phí sửa lỗi thấp

Trang 4

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 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 đã và đang thu hútnhiề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:

- 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)

- Kỹ thuật liên quan tới xấp xỉ ngữ nghĩa được gọi là diễn giải trừutượng (abstract interpretation)

- 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)

- 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 tạimức mã nguồn, trong khi hai nhóm sau xử lý phần mềm tại mức trừutượ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

Trang 5

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 tương ứng là các điểm trong 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 vào, ký hiệu là entry, và một điểm ra, ký hiệu 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).

Trang 6

E E

if(E) S; if(E) S1; else S2;

Hình 3: CFG cho các lệnh if, if-else

Trang 8

Định nghĩa Dàn

(S, ⊑), với S là một tập và ⊑ là quan hệ hai ngôi trên tập S , thỏa mãn

các đ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

ngược (Dàn được sắp bởi thứ tự ngược của các tập con và quan hệ hai

định nghĩa bởi:

Trang 9

Độ cao của dàn

Độ cao của một Dàn được tính bằng chiều dài từ phần tử nhỏ nhất

⊥ tới phần tử lớn nhất ⊤ Dàn L = (S, ⊑) là hữu hạn (chiều cao của Dàn là hữu hạn) nếu tập S chứa hữu hạn số phần tử.

Điểm cố định (Fixed-Point)

Hàm đơn điệu

Lưu ý rằng những phép hợp của những hàm đơn điệu là hàm đơn điệu

Trang 10

Điểm cố định

Điều mà ta cần chính là việc tìm ra điểm cố định của một hàm

Theo lý thuyết điểm cố định [? ], trong một Dàn L với độ cao hữu hạn,

mọi hàm đơn điệu f có duy nhất điểm cố định nhỏ nhất được định

Nếu Dàn L là một Dàn với độ cao hữu hạn, khi đó li f t(L), độ cao

Nếu A là một tập hữu hạn (A không cần thiết phải là một Dàn), khi đó

f lat(A) là một Dàn Cuối cùng, nếu A và L được định nghĩa như trên,

khi đó chúng ta thu được một Dàn ánh xạ (map) với độ cao như sau:

Trang 11

với x i là những biến và F i : L n → L là một tập những hàm đơn điệu.

Mỗi hệ chỉ có nghiệm nhỏ nhất duy nhất, nó được gọi là điểm cố định

1.4.3 Thuật toán điểm cố định

Thuật toán lặp chaotic

Chương 2: Phân tích chương trình tĩnh

2.1: Phân tích luồng dữ liệu nội thủ tụcPhân tích luồng dữ liệu haycòn gọi là khung đơn điệu (monotone framework), là kỹ thuật phân tíchchương trình tĩnh nhằm thu thập các hành vi của chương trình và phát

Trang 12

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:

tập các nút trên CFG

• Bước 2: Khởi tạo Dàn hữu hạn L thông qua các tập biến, biểu

thức trong chương trình

• Bước 3: Xây dựng các hệ phương trình là các ràng buộc luồng

dữ liệu trong chương trình: với mỗi nút v trên CFG ta gán một

hợp ràng buộc luồng dữ liệu (dataflow constraint) được xác địnhliên quan đến giá trị biến của các nút tương với các nút khác, đặcbiệt là các nút láng giếng

2.2.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ươnglai Do đó, trong vế phải của các phương trình chỉ phụ thuộc vàocá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) Với mỗi điểm

của chương trình (nút trên CFG), phân tích quay lại (backwardanalysis) là phân tích thông tin về hành vi trong tương lai Do

đó, trong vế phải của các 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 giúp chương trình

Trang 13

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ủachươ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 đượcghi ở nút hiện tại) Thuộc tính này có thể được xấp xỉ bởi phântích tĩnh dựa trên CFG với một dàn là một tập các biến trong

chương trình Gọi các biến ràng buộc cho mỗi nút v trên CFG là JvK, khi đó các ràng buộc cho tính sống của biến tại các nút với

các cấu trúc lệnh trong chương trình được xác định như sau:

w ∈succ(v) JwK \ {id} ∪ vars(E)

buộc trên là các hàm đơn điệu

Với quan sát trên CFG của một chương trình, một biến là sốngnếu nó được đọc trong nút hiện tại, hoặc nó được đọc trong một

số nút kế tiếp trừ khi nó được ghi ở nút hiện tại

Các ràng buộc được tạo ra như sau:

Trang 14

JentryK = Jint fK

Jint fK = Jint uu_fK \ {f}

Jint uu_fK = Jf = 1K \ {uu_f}

) Hơn nữa, nó dễ dàng thấy rằng tất cả vế phải ràng buộc củaphương trình định nghĩa những hàm đơn điệu Theo kết quả,

lý thuyết của điểm cố định nhỏ nhất có thể được áp dụng [? ].

Nghiệm nhỏ nhất cho hệ phương trình (Được giải trong Phụ lụcA) là duy nhất là:

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 trongtương lai sẽ giúp chương trình chạy nhanh hơn và giúp bộ nhớtối ưu hơn

Trang 15

Một biểu thức E là bận rộn (busy) tại điểm p của chương trình nếu tất cả các đường (path) xuất phát từ một điểm chương trình p phải được đánh giá E trước khi một biến bất kỳ trong biểu thức E

thay đổi Hoặc, ta cũng có thể hiểu là giá trị của biểu thức đượcđánh giá tại thời điểm hiện tại hoặc sẽ được đánh giá trong tất cảcác nút trong tương lai trừ khi một phép gán làm thay đổi giá trịcủa nó Để xấp xỉ thuộc tính này, ta cần Dàn là tập các biểu thứctrong chương trình Đối với phân tích này, ta xác định được cácràng buộc luồng dữ liệu cho các cấu trúc lệnh như sau:

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ểntiếp (forward analysis) là phân tích thông tin về hành vi trong quákhứ Do đó, trong vế phải của các phương trình chỉ phụ thuộcvà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)

Trang 16

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ươngtrình là có sẵn (available) tại một điểm trong chương trình nếugiá 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úpcho việc tính toán nhanh và đơn giản hơn Do vậy, trong phântí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 racho tất cả các điểm chương trình và được sắp bởi các tập con đảo

ngược (reverse) Đối với mỗi nút v trên CFG tương ứng với một

mà nó được đảm bảo luôn luôn có sẵn tại điểm chương trình kế

lặp, nhưng nó không phải là có sẵn tại các phép gán trong vònglặp Phân tích đưa ra sẽ bảo toàn kể từ khi thiết lập tính toán cóthể là quá nhỏ Từ đó, có các ràng buộc luồng dữ liệu cho cáccấu trúc lệnh trong phân tích như sau:

Trang 17

Với hàm↓ id loại bỏ tất cả các biểu thức có chứa một tham chiếu đến biến id, và các hàm exps được định nghĩa là:

Với op là phép toán nhị phân bất kỳ Ta thấy rằng một biểu thức

là có sẵn trong v nếu nó có sẵn từ tất cả các cạnh hoặc được tính toán trong nút v, trừ khi giá trị của nó đã được hủy bởi lệnh gán.

Một lần nữa, phía vế phải của những ràng buộc là những hàmđơn điệu

Phân tích định nghĩa tới được

Trong lĩnh vực kiểm thử và đảm bảo chất lượng phần mềm, việc

xác định đồ thị def-use là việc làm quan trọng trong việc hạn

chế các mã chết (dead code) và những mã chuyển động (codemotion) Vì vậy, mục đích của kỹ phân tích định nghĩa tới được

là xác định mối quan hệ của các biến tại có các điểm của chươngtrình với nhau

Các định nghĩa tới được (reaching denitions) cho những điểmcủa chương trình là những phép gán mà có thể được xác định làgiá trị hiện tại của các biến Đối với phân tích này, chúng ta cầnmột dàn là tập tất cả các phép gán xảy ra trong chương trình Với

định giá trị của biến tại điểm chương trình Ta có các ràng buộccho các lệnh chương trình trong phân tích như sau:

w∈pred(v) JwK) ↓ id ∪ {v}

Trang 18

Với tất cả các nút khác, ràng buộc là:

w ∈pred(v) JwK

2.2 Phân tích luồng dữ liệu liên thủ tục

Trong phân tích liên thủ tục, các vấn đề được luận văn tiếp cận

là việc xây dựng CFG cho toàn chương trình, xem xét tính nhạycảm luồng dữ liệu (sensitivity) và ứng dụng của kỹ thuật phântích này

2.2.1 Xây dựng đồ thị luồng dữ liệu

Để xây dựng CFG cho chương trình liên thủ tục, ta giả sử có mộttập hợp các biến ẩn (shadow) như sau:

trị được trả về của hàm;

trong đó i là chỉ mục biểu thị các giá trị đã được tính toánbằng lời gọi hàm;

toàn giá trị của biến đó trước khi thực hiện việc gọi hàm;

Để đơn giản, ta giả định rằng tất cả các lời gọi hàm được thựchiện trong kết nối với các tham số:

Bây giờ, xem xét các CFG cho lời gọi và hàm được gọi, nếu các

Trang 19

dụ cho phân tích đa biến cho chương trình sau:

Trang 20

call-2=ref-test ref -test=z

save-2-y=y save-1-x=x

y=call-2 x=call-1

ret-g=y ret-f=x

Hình 8: CFG đơn biến

Với cách xây dựng CFG, nếu ta phân tích sự lan truyền hằng số

một cách tuần tự khi đó giá trị trả về trong cả hai hàm f và g

có thể bị sai do cả hai đều cùng gọi hàm test Để giải quyết ngữ

cảnh nhạy cảm này, ta sử dụng phân tích đa biến, tạo ra các saochép CFG hàm được gọi cho mỗi lời gọi hàm Việc xác định sốbản sao chép đơn giản nhất là mỗi lời gọi sẽ tạo ra một sao chépnhư sau:

Trang 21

z=20 int x

call-1=ref-test

save-2-y=y

z=10 int y

call-2=ref-test ref -test=z

save-2-y=y save-1-x=x

y=call-2 x=call-1

ret-g=y ret-f=x

ref -test=z

Hình 9: CFG đa biến

Tuy nhiên, đối với những hàm đệ quy thì số bản sao chép có thể vô hạn

2.2.3 Ứng dụng phân tích luồng dữ liệu liên thủ tục

Một ứng dụng cho phân tích liên thủ tục được gọi là rung cây (tree shaking), đây là ứng dụng để xác định và loại bỏ những hàm không bao

giờ được gọi hay hàm chết và từ đó có thể loại bỏ nó từ chương trình

mà vẫn đảm bảo tính an toàn Điều này thực sự hữu ích nếu chươngtrình thực hiện với thư viện hàm lớn

Với CFG có thể được xây dựng như phần trên đã trình bày, ở đây

ta sử dụng Dàn là tập các tên hàm trong chương trình này Với mỗi nút

được gọi đến trong tương lai Tiếp theo, sử dụng ký hiệu entry(id) cho các nút vào (entry) của hàm id Khi đó, các ràng buộc:

Trang 22

• Cho các phép gán, điều kiện và output là:

Trong đó, hàm funcs được định nghĩa như sau:

Trong phân tích này, vế phải trong các ràng buộc là các hàm đơnđiệu Khi đó, với cách xây dựng CFG cho cả chương trình như trên vàcác ràng buộc cho ứng dụng như trên ta sẽ có hệ phương trình ràngbuộc và việc giải nghiệm cố định nhỏ nhất (Mục ) để tìm ra các hàmtất cả các hàm không được sử dụng trong chương trình Như vậy, ta cóthể loại bỏ các hàm này mà vẫn đảm bảo sự 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 trên công cụ

mã nguồn mở SOOT, hỗ trợ cho chương trình viết bởi ngôn ngữ Java,

và là một plugin tích hợp vào Eclipse

3.1 Tổng quan về SOOT

SOOT là một framework tối ưu hóa cho Java do một nhóm nghiêncứu tại đại học McGill (Canada), năm 2000 Đây là phần mềm nguồnmở

Các bước phân tích trong SOOT

• Bước 1: Cài đặt kiểu phân tích: BackwarkFlowAnalysis(), warkFlowAnalysis()

Trang 23

For-• Bước 2: Cài đặt các 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 các giá trị: newInitialFlow() và tialFlow()

entryIni-• 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 củabiến

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

HÌNH ẢNH LIÊN QUAN

Đồ thị luồng điều khiển (Control-Flow Graph-CFG) là một đồ thị - 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
th ị luồng điều khiển (Control-Flow Graph-CFG) là một đồ thị (Trang 5)
Hình 3: CFG cho các lệnh if, if-else. - 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
Hình 3 CFG cho các lệnh if, if-else (Trang 6)
Hình 4: CFG cho các lệnh while, for. - 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
Hình 4 CFG cho các lệnh while, for (Trang 6)
Hình 5: CFG của chương trình tính giai thừa. - 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
Hình 5 CFG của chương trình tính giai thừa (Trang 7)
Hình 6: Biểu đồ Hasse biểu diễn Dàn. - 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
Hình 6 Biểu đồ Hasse biểu diễn Dàn (Trang 8)
Hình 7: Ví dụ CFG tổng quát cho chương trình có chứa lời gọi hàm. - 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
Hình 7 Ví dụ CFG tổng quát cho chương trình có chứa lời gọi hàm (Trang 19)
Hình 8: CFG đơn biến. - 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
Hình 8 CFG đơn biến (Trang 20)
Hình 9: CFG đa biến. - 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
Hình 9 CFG đa biến (Trang 21)

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w