Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 17 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
17
Dung lượng
726,06 KB
Nội dung
KiểmchứngtừngphầnchochươngtrìnhC
Hoàng Mạnh Khôi
Trường Đại học Công nghệ
Luận văn Thạc sĩ ngành: Công nghệ phần mềm; Mã số: 60 48 10
Người hướng dẫn: PGS.TS Nguyễn Việt Hà
Năm bảo vệ: 2012
Abstract: Trình bày cơ sở lý luận về kiểm chứng. Trình bày các khái niệm cơ bản liên
quan như các khái niệm về mô hình chuyển trạng thái được gán nhãn Hệ chuyển trạng
thái gán nhãn (LTS), các phương pháp biểu diễn LTS, khái niệm về trừu tượng hóa
hành vi của hệ thống Trìu tượng hóa thủ tục (PA), cũng như các khái niệm cần thiết
trong kĩ thuật kiểmchứng … Trình bày nội dung chính của Kiểm thử từngphầncho
chương trình C: nêu cách xây dựng mô hình LTS biểu diễn hành vi của hệ thống từ mã
nguồn bắt đầu bằng việc xây dựng sơ đồ luồng xử lý Otomat luồng điều khiển (CFA);
sơ đồ luồng xử lý mở rộng (Expanding Control flow Automata) của chươngtrình có
sử dụng các LTS giả thiết; giới thiệu phương pháp trừu tượng mệnh đề để xây dựng
được mô hình LTS biểu diễn hành vi của mã nguồn từ sơ đồ luồng xử lý mở rộng; nêu
cách kiểmchứng mô hình LTS của phần cài đặt có đảm bảo với mô hình LTS của đặc
tả. Đưa ra ứng dụng của phương pháp bằng cách giới thiệu các công cụ Copper. Đầu
vào của công cụ này là tập file mã nguồn C của chươngtrình và các đặc tả của các
thuộc tính cần kiểm chứng, đầu ra là kết luận phần cài đặt đã đúng với đặc tả của nó
hoặc đưa ra phản ví dụ chứng minh cài đặt không đúng với đặc tả. Giới thiệu một vài
ứng dụng đơn giản được áp dụng thực tế trên công cụ bằng cách nêu chi tiết cách xây
dựng các file đặc tả cũng như cách xây dựng các PA giả thiết bằng ví dụ.
Keywords: Công nghệ phần mềm; Kiểmchứng mô hình; Mã nguồn C
Content
Chương 1: Giới thiệu
Đảm bảo chất lượng phần mềm là một trong những giai đoạn quan trọng bậc nhất trong quy
trình phát triển phần mềm. Có rất nhiều phương pháp được sử dụng trong việc đảm bảo chất
lượng phần mềm, trong đó kiểmchứng mô hình [6] là một trong những cách tiếp cận hiệu quả
nhất, và ngày càng được sử dụng rộng rãi, đặc biệt là trong các hệ thống phần mềm đòi hỏi độ
chính xác cao.
Kiểm chứng mô hình là một nhóm các kĩ thuật kiểm định tự động một mô hình với các
đặc tả tính năng của mô hình đó. Mô hình là một hệ thống bao gồm tập hợp có giới hạn các
trạng thái và tập hợp các bước chuyển tiếp giữa các trạng thái đó. Kiểmchứng mô hình là xác
minh tính đúng đắn của mô hình bằng cách xác định xem thuộc tính mà người dùng mong
muốn có được thõa mãn bởi mô hình đó hay không [6].
2
Trong kiểmchứng mô hình phần mềm có hai bài toán được quan tâm chính đó là kiểm
chứng đặc tả và kiểmchứng mã nguồn. Bài toán kiểmchứng tự động mã nguồn được xem là
ứng dụng đầu tiên của kiểmchứng mô hình trong việc đảm bảo chất lượng phần mềm. Dù đã
có từ lâu nhưng đến nay nó vẫn là vấn đề mở và chưa có giải pháp thỏa đáng, cho nên nó vẫn
đang nhận được sự quan tâm rộng rãi.
Như chúng ta đã biết một chươngtrìnhC có mã nguồn lớn, sẽ tồn tại nhiều lời gọi
hàm hay nhiều lời gọi đến các thư viện hàm. Việc kiểmchứng theo mô hình một chươngtrình
như vậy sẽ gặp khó khăn và phức tạp vì hoặc có thể chúng ta chưa có được đầy đủ mã nguồn
của các thư viện hàm hoặc dễ gây ra bùng nổ không gian trạng thái. Trong luận văn này tôi
xin giới thiệu một phương pháp mới trong kiểmchứng tự động để kiểmchứng một cài đặt của
chương trìnhC có mã nguồn lớn và có nhiều thành phần.
Cách tiếp cận của phương pháp là chúng ta đưa việc kiểmchứng một chươngtrình
phần mềm lớn về việc kiểmchứng các thành phần con nhỏ hơn và đơn giản hơn bằng cách
trừu tượng hóa hành vi [3] (procedure abtraction-PA) của các thành phần con (hay các hàm
thư viện) theo một khái niệm đặc tả của máy hữu hạn trạng thái đó là hệ thống chuyển trạng
thái được gán nhãn LTS (Label Transition System) [4]. Phương pháp cho phép chúng ta tự
định nghĩa các hành vi của các hàm thư viện (chưa có mã nguồn hoặc chưa rõ hành vi) và sử
dụng chúng như là giả thiết trong quá trình xây dựng mô hình kiểm chứng.
Nội dung chính của luận văn là giới thiệu phương pháp kiểmchứngphần cài đặt của
một hệ thống viết bằng ngôn ngữ C có đảm bảo đúng với đặc tả của nó, để làm được điều đó
trước hết từ mã nguồn Cchúng ta phải xây dựng được mô hình LTS biểu diễn hành vi của hệ
thống, sau đó sử dụng kĩ thuật kiểmchứng để thẩm định xem nó có đảm bảo đúng với mô
hình LTS của đặc tả hay không.
Nội dung của luận văn được trình bày trong 4 chương:
Chương 1 giới thiệu về đề tài, trình bày tổng quan về nội dung phương pháp được
nghiên trong đề tài, mục tiêu của đề tài và cấu trúc của luận văn.
Chương 2 trình bày các khái niệm cơ bản phục vụ cho đề tài, chương này đưa ra các
khái niệm về mô hình chuyển trạng thái được gán nhãn LTS, khái niệm về trừu tượng hóa
hành vi của hệ thống PA, cũng như các khái niệm cần thiết trong kĩ thuật kiểmchứng …
Chương 3 trình bày nội dung chính của luận văn, đó là nêu cách xây dựng mô hình
LTS biểu diễn hành vi của hệ thống từ mã nguồn bắt đầu bằng việc xây dựng sơ đồ luồng xử
lý CFA (Control Flow Automata) [3] và sơ đồ luồng xử lý mở rộng (Expanding Control flow
Automata) [3] của chươngtrình có sử dụng các LTS giả thiết. Nêu cách kiểmchứng mô hình
LTS của phần cài đặt có đảm bảo với mô hình LTS của đặc tả.
Chương 4 luận văn đưa ra ứng dụng thực tế của phương pháp bằng cách giới thiệu các
công cụ Copper [2]. Đầu vào của công cụ này là tập file mã nguồn C của chươngtrình và các
3
đặc tả của các thuộc tính cần kiểm chứng, đầu ra là kết luận phần cài đặt đã đúng với đặc tả
của nó hoặc đưa ra phản ví dụ chứng minh cài đặt không đúng với đặc tả.
Chương 2: Một Số Khái Niệm Cơ Bản
Trong chương này chúng ta sẽ tìm hiểu một số khái niệm cần thiết như máy hữu hạn trạng
thái, hệ chuyển trạng thái được gán nhãn và khái niệm về trừu tượng hóa hành vi một chương
trình…
2.1 Hệ chuyển trạng thái được gán nhãn - LTS
Định nghĩa 2.1: Hệ thống chuyển trạng thái được gán nhãn (Labeled Transition System –
LTS[4])
Một hệ chuyển trạng thái được gán nhãn M là một bộ có thứ tự gồm 4 thành phần
trong đó:
S là một tập khác rỗng các trạng thái của M
là trạng thái khởi tạo
Act là tập các hành động quan sát được
là hàm chuyển trạng thái
Ta kí hiệu nếu có một hành động chuyển hệ thống từ trạng thái S sang
trạng thái S’. Trạng thái kết thúc STOP là trạng thái mà ở đó không có hành động để chuyển
sang một trạng thái nào khác, tức với .
4
Chú ý 2.1: Chúng ta dùng để kí hiệu trạng thái lỗi đặc biệt của hệ thống, và để biểu diễn
LTS <{π}, Act, , π>.
Ví dụ 2.1:
Ở trên là một ví dụ về hệ chuyển trạng thái được gán nhãn M = , trong
đó:
S = {S0, S1, STOP}
Act = {lock, return {0}, return {1}}
T = { (S0, lock, S1), (S1, return {0}, STOP), (S0, return {1}, STOP)}
S0 là trạng thái khởi đầu.
Định nghĩa 2.2: Dẫn xuất của một hệ chuyển trạng thái được gán nhãn M.
Dẫn xuất của một hệ chuyển trạng thái được gán nhãn M = là một
chuỗi hữu hạn các hành động với , (i = 1, ,n).
Như vậy dẫn xuất của hệ chuyển trạng thái được gán nhãn M là một chuỗi các hành
động quan sát được mà M có thể thực hiện từ trạng thái khởi tạo .
Chú ý 2.2: Ta ký hiệu ↑Σ là một dẫn xuất thu được bằng cách loại bỏ khỏi tất cả các hành
động a mà a
Σ. Tập tất cả các dẫn xuất của M được gọi là ngôn ngữ của M, ký hiệu L(M).
Một dẫn xuất = a1a2 an là một dẫn xuất hữu hạn trên hệ chuyển trạng thái được gán nhãn
M. Ta ký hiệu hệ chuyển trạng thái được gán nhãn Mσ = (S, S0, , ) với S = {s0, s1, ,
sn} và = { (si-1, ai, si)} với i=1, ,n. Ta nói rằng một hành động a được chấp nhận từ
một trạng thái s S nếu tồn tại s S sao cho (s, a, s ) . Tương tự vậy ta nói rằng một
dẫn xuất a1a2 …an được chấp nhận từ trạng thái s S nếu tồn tại một dãy các trạng thái s0,
s1, …, sn với s0 = S0 sao cho i= thì (si-1, ai, si) .
Định nghĩa 2.3:
Cho một dẫn xuất = và hai trạng thái s, t của hệ chuyển trạng thái
được gán nhãn M = . Ta nói rằng t có thể đi đến được từ s thông qua dẫn xuất
(viết là ) nếu tồn tại một tập các trạng thái với s = và t = sao cho
.
2.2 Trừu tượng hóa thủ tục (Procedure Abstraction-PA)
Để kiểmchứng một chươngtrình từ mã nguồn chúng ta phải trừu tượng hóa được các hành vi
của chươngtrình và các hàm thư viện của nó bằng các đặc tả LTS. Trong một chươngtrình C,
5
một hàm thư viện có thể thực hiện những chức năng khác nhau tùy thuộc vào tham số đầu vào
hay ngữ cảnh thực hiện, trong cách tiếp cận của phương pháp này chúng ta đưa ra khái niệm
trừu tượng hóa thủ tục (procedure abstraction - PA) [3] cho phép nhiều đặc tả LTS biểu diễn
cho một thủ tục hàm.
PA (procedure abstraction) của một thủ tục hàm proc là một tập hữu hạn các cặp
,… trong đó:
là điều kiện (guard) ràng buộc trên các tham số của proc.
là LTS trừu tượng hóa hành vi của proc ứng với điều kiện đạt giá trị true.
Chú ý 2.3: Trong quá trìnhkiểm chứng, đối các hàm thư viện không có mã nguồn thì các PA
của nó được người dùng tự định nghĩa và cung cấp như là các giả thiết trong việc xây dựng
mô hình kiểm chứng, ta xem đó là các PA giả thiết.
Chương 3: Phương Pháp KiểmChứng
Mục đích chính của chúng ta là cần phải kiểmchứng xem phần cài đặt mã nguồn của một
chương trìnhC có thõa mãn với đặc tả của nó (được biểu diễn bằng một LTS) hay
không? Để làm được việc đó thì trước hết từ phần cài đặt chúng ta phải xây dựng được một
mô hình (biểu diễn bằng một LTS) mô tả hành vi của phần cài đặt, sau đó sử dụng kĩ
thuật kiểmchứng để kiểm định sự thõa mãn của với .
3.1 Xây dựng mô hình
Cho một chươngtrìnhC và một tập các mệnh đề logic (predicates) P, hệ trạng thái được gán
nhãn =( ) là đặc tả của chươngtrình và các PAs giả
thiết . Trong phần này sẽ trình bày cách xây dựng từ mã nguồn của
chương trình bằng cách sử dụng các PA giả thiết, các điều kiện (Guard) và tập một các
mệnh đề logic P. Việc xây dựng dựa trên các nguyên tắc sau:
Mỗi trạng thái của được mô hình từ một trạng thái của chươngtrình trong quá
trình thực hiện, vì vậy mỗi trạng thái sẽ bao gồm một thành phần điều khiển (control
component) và một thành phần dữ liệu (data component).
Thành phần điều khiển là đại diện trực quan cho các giá trị của chươngtrình và nó thu
được từ otomat luồng điều khiển (CFA) của chương trình.
Thành phần dữ liệu là đại diện trừu tượng cho trạng thái các biến của chương trình,
được tính toán dựa trên tập các mệnh đề logic P.
Các bước chuyển trạng thái trên tương ứng với các bước chuyển trạng thái trên
CFA.
6
Không mất tính tổng quát ta giả thiết trong chươngtrình có 5 loại lệnh gán, gọi hàm,
rẽ nhánh if –then-else, return và lệnh goto. Ta cũng gọi Stmt là tập các câu lệnh của chương
trình và Exp là tập tất cả các biểu thức logic (ví dụ như các điều kiện rẽ nhánh) trên các biến
của chương trình.
3.1.1 Otomat luồng điều khiển
Việc xây dựng mô hình từ mã nguồn của một chươngtrìnhC bắt đầu bằng việc xây
dựng otomat luồng điều khiển (CFA) của chươngtrình theo nguyên tắc:
Mỗi trạng thái của CFA là một điểm điều khiển (control location) trong chươngtrình
(tương ứng với một câu lệnh trong chương trình).
Mỗi bước chuyển trạng thái trong CFA tương ứng với một bước chuyển giữa hai điểm
điều khiển (hai câu lệnh) trong chương trình.
Định nghĩa 3.1: CFA của một chươngtrìnhC
CFA của một chươngtrình là một bộ gồm 4 thành phần trong đó:
là tập các trạng thái.
là trạng thái khởi tạo.
là tập các chuyển đổi trạng thái.
là hàm gán nhãn các trạng thái của CFA.
{Final} là trạng thái kết thúc duy nhất của CFA. là lệnh khởi tạo của chương
trình, và nếu và chỉ nếu một trong các điều kiện sau đây được thõa mãn:
Nếu là lệnh gán, lệnh gọi hàm hoặc lệnh goto và là lệnh kế tiếp duy nhất
của nó trong π.
Nếu là lệnh rẽ nhánh và là lệnh kế tiếp nó sau then hoặc else trong π.
Nếu là lệnh return và = {Final}.
Như vậy CFA là mô hình đơn giản nhất của chươngtrình tuy nhiên nó chỉ mới mô
hình được luồng điều khiển của chươngtrình mà chưa trừu tượng hóa được dữ liệu các biến
tại các trạng thái của chương trình. Để làm được điều này chúng ta sử dụng đến tập các mệnh
đề logic P và một phương pháp gọi là predicate abstraction [3] để xây dựng một otomat luồng
điều khiển mở rộng.
3.1.2 Otomat luồng điều khiển mở rộng
Mô hình otomat luồng điều khiển mở rộng là sự kết hợp giữa mỗi trạng thái s của CFA với
một tập con của Exp thu được từ P gọi là (P thường là các điều kiện rẽ nhánh trong chương
trình). Như vậy nếu có k phần tử mỗi phần tử nhận giá trị là true hoặc false thì lúc đó mỗi
7
trạng thái trong CFA sẽ tương ứng với trạng thái trong CFA mở rộng. Việc xây dựng LTS
thực hiện theo các bước như sau:
1) Xây dựng CFA
2) Xây dựng một CFA mở rộng theo nguyên tắc:
Với mỗi trạng thái trong CFA, chúng ta bổ sung trạng thái trong , mỗi trạng
thái trong CFA mở rộng là tổ hợp trạng thái trong CFA và giá trị của tập các mệnh đề
logic đang xem xét.
Xem xét một cạnh trong CFA. Lúc đó mỗi và sẽ tương ứng với trạng
thái trong tập các trạng thái . Như vậy có khả năng chuyển đổi
trạng thái tương ứng trong . Tuy nhiên không phải tất cả các khả năng chuyển
trạng thái đều thuộc . Chúng ta sẽ sử dụng kĩ thuật theorem prover [4] để quyết
định xem phép chuyển đổi nào là thực sự được chấp nhận. Chúng ta cũng sẽ chỉ loại
bỏ những chuyển trạng thái nào bị loại trừ bởi theorem prover.
3) là mô hình chính xác hơn so với CFA. Tuy nhiên nó cũng không mô hình hóa
được hành vi của các hàm thư viện mà thủ tục proc gọi đến. Để làm được việc đó thì
chúng ta phải kết hợp các PAs giả thiết với . LTS thu được sau khi kết hợp với các
PAs giả thiết chính là .
3.1.3 Phương pháp trừu tượng mệnh đề
Trừu tượng mệnh đề [8] là phương pháp tiếp cận nhằm mô hình hóa trạng thái của một
chương trình dựa trên một tập các mệnh đề logic (predicates). Ở đây ta cũng sử dụng các kí
hiệu và để thay thế cho những kí hiệu của phép toán logic tương đương trong C đó là
&&, || và !.
Gọi π là một chươngtrìnhC và P là một tập các mệnh đề logic (predicates) của các
biến trong π, ta kí hiệu A(π,P) là một mô hình trừu tượng của π theo P (hay A(π,P) chính là
CFA mở rộng của π). Ta cũng định nghĩa Stmt là tập các câu lệnh của π và Exp là tập tất cả
các biểu thức trên các biến của π.
Giả sử rằng π chỉ bao gồm 1 khối mã nguồn và không có các con trỏ hàm hay các gọi
hàm đệ quy. Như vậy không mất tính tổng quát ta giả thiết trong π có 4 loại là lệnh gán, lệnh
gọi hàm, lệnh rẽ nhánh if-then-else, lệnh return và lệnh goto.
Như ta đã biết thì CFA là mô hình đơn giản nhất của một chươngtrình và từ cách xây
dựng CFA ta có thể thấy CFA tương đương với A(π, ).
Mô hình A(π,P) là sự kết hợp giữa mỗi trạng thái s của CFA với một tập con của Exp
thu được từ P, gọi là . Việc xây dựng từ P sẽ được miêu tả bằng thuật toán Predicate
8
Inference sau đây với chú ý là nếu s là trạng thái kết thúc Final hoặc là một
lệnh return và P là một tập con của các lệnh rẽ nhánh trong π.
Trước hết ta tìm hiểu khái niệm Weakest Preconditon WP của một biểu thức logic p
theo một câu lệnh a trong π.
Định nghĩa 3.1: Weakest Precondition WP
Cho một câu lệnh a và là một biểu thức logic của C ( ) thì WP của đối
với a gọi là sẽ được định nghĩa như sau:
Nếu a là một lệnh gán có dạng v = e thì thu được từ bằng cách thay thế tất
cả v xuất hiện trong bằng e.
Nếu a là một lệnh gán có dạng *v = e. là tập các biến xuất hiện ở trong và
với , là lệnh gán . Lúc đó = ( )
( )
Ví dụ 3.1: Cho là biểu thức (x==5), và nếu a là lệnh gán x = e, ta có =
= . Còn nếu a là lệnh gán có dạng *x = e lúc đó ta có
= ( ) =
( ) .
Thuật toán Predicate Inference:
Input: Tập các lệnh rẽ nhánh P trong π.
Output: Tập các được kết hợp với tương ứng từng trạng thái s trong CFA của π.
Khởi tạo: ∀ s ∈ S
CF
, P
s
= ∅
Do forever
For each s ∈ S
CF
do
IF (ℒ(s) == lệnh gán and ℒ(s′) là lệnh tiếp theo của nó) THEN.
For each p′ ∈ P
s′
thêm WP(p
′
, ℒ(s)) vào trong P
s
.
Else (If ℒ(s) == lệnh rẽ nhánh với điều kiện rẽ nhánh là c) THEN
IF (ℒ(s) ∈ P) THEN thêm c vào P
s
.
IF (ℒ(s′) là lệnh kế tiếp ℒ(s) sau then hoặc else) THEN P
s
:=
P
s
∪ P
s′
.
Else IF (ℒ(s) là lệnh goto và ℒ(s′) là lệnh tiếp theo của nó) THEN
P
s
:= P
s
∪ P
s′
.
IF (không tồn tại P
s
để tiếp tục chỉnh sửa trong vòng lặp) THEN
EXIT.
9
Trạng thái và tập các bước chuyển trạng thái trong mô hình
Mỗi trạng thái của mô hình A(π,P) (hay trong CFA mở rộng) sẽ tương ứng với một
trạng thái trong CFA kết hợp với tập các giá trị của tập mệnh đề logic tại các trạng thái đó.
Cho một CFA của một chươngtrình và một trạng thái s trên CFA đó, giả sử
thì giá trị của là một véc tơ kiểu Boolean . Gọi là tập tất
các các giá trị của thì hàm concretization của được xác định như sau:
Với thì trong đó = và =
. Chú ý thì và .
Ví dụ 3.2: Giả sử với , và
lúc đó ta có:
.
.
Việc xây dụng các bước chuyển trạng thái trong mô hình yêu cầu phải sử dụng
theorem prover. Trước hết ta tìm hiểu hai khái niệm được chấp nhận (admisible) và không
được chấp nhận (inadmisible).
Cho hai biểu thức bất kì chúng ta nói rằng 2 biểu thức là được chấp nhận
(admissible) nếu theorem prover cho giá trị TRUE hoặc UNKNOWN trên biểu thức
, kí hiệu là Adm( ), ngược lại các trường hợp khác là không được chấp
nhận (inadmissible), kí hiệu là .
Như vậy với CFA của một chươngtrình là ta có thể định nghĩa
CFA mở rộng (hay mô hình A(π,P)) như sau đây. Mô hình A(π,P) là một bộ gồm 3 thành
phần trong đó:
là tập các trạng thái.
là tập các trạng thái khởi tạo.
là tập các bước chuyển đổi trạng thái và được xây dựng như
sau nếu và chỉ nếu và một trong các điều kiện sau
được thõa mãn :
1. là lệnh gán và Adm( ).
2. là lệnh rẽ nhánh với điều kiện rẽ nhánh là c, là lệnh kế tiếp của nó
sau THEN, Adm( ) và Adm( ).
10
3. là lệnh rẽ nhánh với điều kiện rẽ nhánh là c, là lệnh kế tiếp của nó
sau ELSE, Adm( ) và Adm( ).
4. là lệnh goto và Adm( ).
5. là lệnh return và là trạng thái kết thúc (FINAL).
3.2 Kiểmchứng
Như vậy chúng ta đã trình bày cách xây dựng mô hình LTS từ mã nguồn của một
chương trình C. Trong phần này chúng ta sẽ trình bày cách kiểmchứng xem có thõa
mãn đặc tả của hệ thống hay không.
3.2.1 Phép ghép nối song song
Một toán tử ghép nối song song[7], ký hiệu || là một phép toán ghép nối 2 thành phầnphần
mềm (được biểu diễn bằng 2 hệ trạng thái được gán nhãn) bằng cách đồng bộ các hành vi
chung trên bảng chữ cái và đan xen các hành động còn lại.
Giả sử có 2 hệ chuyển trạng thái được gán nhãn là M1= (S1, S01, Act1, T1) và M2=
(S2, S02, Act2, T2), ghép nối song song giữa M1 và M2, ký hiệu M1 || M2 được định nghĩa
như sau:
Nếu M1 = hoặc M2 = thì M1|| M2 = . Ngược lại, M1|| M2 = (S, S0, Act, T)
trong đó:
S= S1S2, Act= Act1 Act2, S0 = (S01, S02) và hàm T được xác định như sau:
Với mọi (s
1
,a,s
2
) ∈ T
1
và (s
1
′, a, s
2
′) ∈ T
2
thì ( (s
1
, s
1
′), a, (s
2
, s
2
′) ) ∈ T
Với (s
1
,a,s
2
) ∈ T
1
, a ∉ Act
2
thì s′ ∈ S
2
ta có ( (s
1
,s′), a, (s
2
,s′) ) ∈ T
Với (s
1
′, a, s
2
′) ∈ T
2
, a ∉ Act
1
thì s ∈ S
1
ta có ( (s, s
1
′), a, (s, s
2
′) ) ∈ T
Ví dụ 3.3: Ghép nối song song hai LTS Input và Output như trên hình 3.1
Hình 3.1: LTS Input và Output
Khi ghép nối hai mô hình trên, hai hành động send và ack là đồng bộ, các hành động
còn lại đan xen nhau. Theo các quy tắc trên ta xác định được hệ chuyển trạng thái song song
được gán nhãn M′ = (S′, S
0
′, Act′, T′) trong đó:
S′ = S
1
x S
2
= {(0,a), (0,b), (0,c), (1,a), (1,b), (1,c), (2,a), (2,b), (2,c)}
Act′ = {in, send, out, ack}
Input
0
1
2
in
send
ack
a
b
c
send
out
ack
Output
[...]... thu c tính p Chương 4: Ứng Dụng Với C ng C Copper 4.1 C ng c Copper Trong ccphần trư c của luận văn đã đề c p phương pháp kiểmchứng mô hình cho một chương trình viết bằng ngôn ngữ C, trong chương này chúng ta sẽ tìm hiểu một vài ví dụ ứng dụng th c tế c a phương pháp trên c ng cc tên là Copper Copper là một c ng ckiểmchứng tự động mã nguồn một chươngtrìnhC đư c phát triển bởi một nhóm t c. .. Copper là một file chứa mã nguồn C của chương trình và một file đ c tả c a nó File đ c tả sẽ cung c p thông tin về cc LTS c a cc hàm thư viện đư c dùng trong chương trình (kể ccc hàm không c mã nguồn) c ng như cc LTS c a thu c tính c n kiểmchứng Copper sẽ đưa ra kết quả thõa mãn nếu mã nguồn chương trình C là đảm bảo với thu c tính c n kiểm chứng, trong trường hợp ngư c lại sẽ đưa ra phản ví dụ 4.2... PA c a một hàm… 16 Chương 3 là nội dung chính c a đề tài trình bày c ch xây dựng mô hình LTS đ c tả chươngtrình từ mã nguồn bằng c ch sử dụng cc PA giả thiết mô tả cc hàm thư viện không c mã nguồn, và một tập cc biểu th c logic trên cc biến c a chươngtrình và nêu c ch kiểmchứng sự thõa mãn c a một LTS M với một đ c tính p bằng c ch sử dụng phép ghép nối song song LTS M và một LTS lỗi c a p Chương. .. PhilSpec1 conformance relation does not exist !! specification abs_1 is invalid KẾT LUẬN Luận văn tập trung vào nghiên c u phương pháp kiểmchứng mô hình một chươngtrìnhC từ mã nguồn và ứng dụng th c tiễn c a phương pháp trên c ng ckiểmchứng tự động Copper Chương 1 và chương 2 trình bày ngữ c nh và cc khái niệm c sở c a đề tài như cc khái niệm về hệ chuyển trạng thái, phương th c trừu tượng... my_proc Trong file đ c tả ta định nghĩa điều c n phải kiểmchứng như sau: program my_proc { specification abs_1, {$1 == 0}, S1; } Trong đó abs_1 là tên định danh sử dụng để Copper nhận biết khi th c hiện vi ckiểmchứng Lưu chươngtrìnhC ở trên vào một file c đuôi là “.pp”, ví dụ như là my_proc.pp Sau đó lưu đ c tả c a nó vào một file kh c có đuôi là “.spec” ví dụ là my_proc.spec, nội dung file spec... dụng th c tiễn c a phương pháp trên c ng c Copper Hướng phát triển Luận văn chỉ mới trình bày đư ccc kiến th c cơ bản và ý tưởng giải thuật c a phương pháp, áp dụng trên cc ví dụ đơn giản Hướng nghiên c u tiếp theo c a luận văn này là tìm hiểu về kĩ thuật theorem prover ứng dụng trong quá trình xây dựng mô hình từ mã nguồn, nghiên c u áp dụng phương pháp cho vi ckiểmchứng một chươngtrình viết... giả c a viện nghiên c ng nghệ phần mềm (SEI) c a trường đại h c Carnegie Mellon University (CMU) Copper c i đặt trên môi trường UNIX ho c giả UNIX (Cygwin), giao tiếp với người dùng thông qua cc dòng lệnh và sử dụng khái niêm FSP (finite state process) để biểu diễn cc LTS Kiến tr c của Copper đư c miêu tả như trên hình 4.1 12 Hình 4.1: Kiến tr c công c Copper Đầu vào c a Copper là một file chứa... S1; specification abs_2, {$1 != 0}, S1; specification abs_3, {$1 == 0}, S2; specification abs_4, {$1 != 0}, S2; } Chúng ta chạy Copper với lệnh sau: copper default specification abs_1 my_proc .c. pp my_proc.spec –trace Kết quả output Copper kết luận my_proc thõa mãn S1 với điều kiện tham số đầu vào bằng 0 conformance relation exists !! specification abs_1 is valid Chúng ta kiểm tra abs_2 bằng Copper... nhất c a hàm my_proc Chúng ta c ng cung c p cho Copper 2 PA giả thiết miêu tả hành vi 2 hàm thư viện foo và bar như sau: 14 FOO = (call_foo -> return {$0 == -1} -> STOP ) procedure foo { abstract {1, FOO};} BAR = (call_bar -> return {$0 == 50} -> STOP ) procedure bar { abstract {1, BAR};} Giả sử bây giờ chúng ta muốn kiểmchứng với điều kiện tham số thứ nhất c a my_proc bằng 0, LTS S1 là đ c tả đúng c a... Thu c tính an toàn là thu c tính đảm bảo không c lỗi xảy ra trong quá trình th c hiện c a hệ thống Một thu c tính an toàn p đư c biểu diễn dưới dạng một hệ chuyển trạng thái đư c gán nhãn an toàn p = (Sp, S0p, Actp, Tp) Ngôn ngữ c a nó L(p) là tập tất ccc hành vi đư c đoán nhận trên Act p Định nghĩa 3.4: Hệ chuyển trạng thái đư c gán nhãn lỗi Hệ chuyển trạng thái đư c gán nhãn lỗi c a một thu c tính . kiểm chứng một c i đặt c a
chương trình C có mã nguồn lớn và c nhiều thành phần.
C ch tiếp c n c a phương pháp là chúng ta đưa vi c kiểm chứng một chương. Copper. Đầu
vào c a c ng c này là tập file mã nguồn C của chương trình và c c đ c tả c a c c
thu c tính c n kiểm chứng, đầu ra là kết luận phần c i đặt đã