Tải bản đầy đủ (.docx) (30 trang)

Báo cáo môn học các vấn đề hiện đại công nghệ phần mềm

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (666.44 KB, 30 trang )

Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.

LỜI CẢM ƠN
Để hồn thành báo cáo mơn học các vấn đề hiện đại công nghệ phần
mềm một cách hồn chỉnh, chúng em xin bày tỏ lịng cảm ơn chân thành đến
các thầy cô đã hướng dẫn chúng em tại trường Đại Học Công Nghệ. Đặc biệt
là thầy Đặng Đức Hạnh và cô Vũ Diệu Hương, thầy cô đã trực tiếp hướng
dẫn tận tình, sửa chữa và đóng góp nhiều ý kiến quý báu giúp chúng em hoàn
thành tốt báo cáo mơn học của mình.
Lời cảm ơn chân thành và sâu sắc, chúng em xin gửi đến gia đình, đã
luôn sát cánh và động viên chúng em trong những giai đoạn khó khăn nhất.
Chân thành cảm ơn đến các bạn trong lớp đã hỗ trợ để chúng em có
thể hồn thành tốt cơng việc được giao.
Chúng em xin chân thành biết ơn sự tận tình dạy dỗ của tất cả các quý
thầy cô Khoa Công nghệ Thông tin – Trường Đại học Công Nghệ Thông
Tin – Đại học Quốc gia Hà Nội.
Chúng cũng xin chân thành gửi lời cảm ơn đến tất cả các thầy cô đã
giảng dạy chúng em thời gian qua, đã truyền đạt và trang bị cho chúng em
những kinh nghiệm, kiến thức chuyên môn, giúp chúng em mở rộng tầm nhìn
khi thâm nhập vào thực tế. chúng em xin hứa sẽ không ngừng phấn đấu nỗ
lực vươn lên trong học tập và công tác sau này.

1


Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.

Phụ lục

2



Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.

CHƯƠNG 1
GIỚI THIỆU
1.1

Đặt vấn đề

Trong các công ty phát triển phần mềm hầu hết công việc kiểm thử của
kiểm thử viên được thực hiện thủ công bằng tay. Trong khi đó số lượng tình
huống kiểm tra q nhiều mà các kiểm thử viên khơng thể hồn tất bằng tay
trong thời gian cụ thể nào đó. Hoặc khi nhóm lập trình đưa ra nhiều phiên bản
phần mềm liên tiếp để kiểm tra. Thực tế cho thấy việc đưa ra các phiên bản
phần mềm có thể là hàng ngày, mỗi phiên bản bao gồm những tính năng mới,
hoặc tính năng cũ được sửa lỗi hay nâng cấp. Việc bổ sung hoặc sửa lỗi code
cho những tính năng ở phiên bản mới có thể làm cho những tính năng khác đã
kiểm tra tốt chạy sai mặc dù phần code của nó khơng hề chỉnh sửa. Để khắc
phục điều này, đối với từng phiên bản, kiểm thử viên không chỉ kiểm tra chức
năng mới hoặc được sửa, mà phải kiểm tra lại tất cả những tính năng đã kiểm
tra tốt trước đó. Điều này khó khả thi về mặt thời gian nếu kiểm tra thông
thường. Để giải quyết vấn đề này chúng ta áp dụng kỹ thuật kiểm thử dựa trên
mơ hình cho quá trình sinh các ca kiểm thử tự động. Nhưng làm sao để thực
hiện được quá trình sinh các ca kiểm thử tự động chúng ta phải áp dụng khá
nhiều các cơng nghệ sẵn có và thơng dụng nhất. Ở đây chúng em xin giới
thiệu mã nhúng C vào mô tả Promela và trình bày cơng cụ Spin để sinh ra các
ca kiểm thử tự động từ đó áp dụng vào một bài toán cụ thể.
Trong báo cáo này chúng em tập trung trình bày về việc nghiên cứu
kiểm thử dựa trên mơ hình và ứng dụng cơng cụ Spin vào việc tự động sinh
các ca kiểm thử: Xây dựng mơ hình hệ thống và thực nghiệm. Bên cạnh đó

chúng em cũng giới thiệu qua về trình soạn thảo Emac, một cơng cụ lập trình
khá hay và ra đời từ rất sớm, chạy được trên nhiều hệ điều hành thông dụng.
1.2 Nội dung báo cáo môn học

3


Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.

Bài báo cáo trình bày ngơn ngữ Promela vào thiết kế Promela và áp
dụng kĩ thuật sử dụng công cụ Spin là hai nội dung quan trong nhất của q
trình sinh ca kiểm thử tự động.
Đề xuất bài tốn cụ thể để thực hiện công việc Demo một chương trình
nhỏ. Từ đó đem áp dụng vào phục vụ cho việc kiểm chứng phần mềm.
Xây dựng tài liệu hướng dẫn về ngơn ngữ Promela, cơng cụ Spin, trình
soạn thảo Emac phục vụ cho việc nghiên cứu, giảng dậy và ứng dụng thực
tiễn.
1.3 Cấu trúc báo cáo mơn học
Các phần cịn lại của khóa luận có cấu trúc như sau:
Chương 2: Trình bày các khái niệm về ngơn ngữ mơ hình promela,
bao gồm các định nghĩa cơ bản về khai báo biến và kiểu, định danh, hằng
số, biểu thức, tiến trình.
Chương 3: Giới thiệu công cụ Spin, cấu trúc cú pháp lệnh, tham số
lệnh và chức năng của nó.
Chương 4: Giới thiệu cơng cụ soạn thảo Emacs.
Chương 5: Tóm tắt các kết quả đã đạt được, kết luận, những hạn chế
và hướng nghiên cứu phát triển trong tương lai.

4



Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.

CHƯƠNG 2
TRÌNH BÀY KHÁI NIỆM MƠ HÌNH PROMELA
Chương này sẽ lần lượt trình bày những khái niệm cơ bản về mơ hình
Promela. Khái niệm cụ thể về cấu trúc cú pháp lệnh, thủ tục hàm, cách khai
báo biến trong Promela.
2.1

Khái niệm cơ bản ngơn ngữ Promela

Xây dựng mơ hình hệ thống bằng ngôn ngữ Promela là một công đoạn
quan trọng trong kiểm thử dựa trên mơ hình, để từ đó có thể dùng cơng cụ
Spin sinh ra các ca kiểm thử. Ngơn ngữ mơ hình Promela có nhiều nét tương
đồng với ngơn ngữ C.


Định nghĩa Promela (Process meta language )

Promela là ngơn ngữ mơ hình dùng để mơ tả hệ thống đồng thời [The
Spin Model Checker: Primer and Reference Manual].
Ví dụ: Giao thức mạng, hệ thống điện thoại, các chương trình giao tiếp
đa luồng,…
• Cấu trúc chương trình Promela

Một chương trình Promela cơ bản gồm:






Khai báo kiểu.
Khai báo biến.
Khai báo tiến trình.
[init process].

// Các khai báo kiểu và biến
mtype = {MSG, ACK};
chan toS = ...
chan toR = ...
bool flag;
// Một tiến trình
proctype Sender() {
// Thân một tiến trình
...
}
5


Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.

proctype Receiver() {
...
}
// Tiến trình init
init {
// Tạo một tiến trình
...
}


2.2

Biến và Kiểu

Giống như nhiều ngơn ngữ lập trình khác, Promela yêu cầu các biến
phải được khai báo trước khi chúng có thể được sử dụng. Khai báo biến theo
phong cách của ngơn ngữ lập trình C. Theo mặc định tất cả các biến của các
loại biến cơ bản được bắt đầu từ 0. Cũng như trong C thì 0 được coi như sai
và khác 0 được coi là đúng. Một biến có thể là biến tồn cục hoặc là biến địa
phương của mỗi tiến trình.
Kiểu dữ liệu
Kiều

Miền giá trị

bit or bool

{ 0, 1}

byte

0…255

short

-215 … 215 - 1

int


-231 … 231 – 1
• Kiểu khai báo
int
ii;
bit
bb;
bb = 1;
ii = 2;

• Kiểu cấu trúc
Records (structs): Có thể tìm ra xung đột khi chạy
Typedef record{
short f1;
byte f2;
}
6


Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.

Truy cập như C
Record
rr.f1 = …

rr;

• Kiểu mảng
Một mảng có cấu trúc như sau:
int table[max]
Lưu ý rằng điều này tạo ra một mảng max-1 số nguyên:

table[0], table[1], ... table[max-1]
• Kiểu liệt kê
Một bộ các hằng số tượng trưng được khai báo như sau:
mtype = {LINE_CLEAR, TRAIN_ON_LINE, LINE_BLOCKED}

• Kênh (Chanel): Được sử dụng để trao đổi dữ liệu giữa các tiến trình.
Cú pháp:
chan <name> = [<dim>] of <type1>,<type2>, <typen>;
Cú pháp gửi tin nhắn trong một kênh (!)
chan-name ! <expr1>, <expr2>..... <exprn>;
Cú pháp nhận tin nhắn trong một kênh (?)
chan-name ? <expr1>, <expr2>.....<exprn>;
2.3

Định danh, Hằng số và Biểu thức
• Định danh
Định danh có thể là một chữ cái, một ký tự.
• Hằng số
Hằng số là một chuỗi ký tự đại diện cho một số nguyên thập phân.
Hằng số tượng trưng có thể được định nghĩa như sau:

#define MAX 999
• Biểu thức

7


Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.

Một biểu thức được xây dựng từ các biến, hằng số và sử dụng các toán

tử sau đây:
+, -, *, /, %, --, ++,
>, >=, <, <=, ==, !=,
&&, ||, !,
&, |, ~, ^, >>, <<,
!, ?,
(), [],

2.4

Tiến trình

Tiến trình là một thành phần của hệ thống và được định nghĩa bởi các đối
tượng tồn cục.


Một tiến trình được khai báo bắt đầu bằng một từ khóa proctype và
gồm có:
Tên
Danh sách thơng số chính
Khai báo biến cục bộ
Thân chương trình

• Cú pháp của một khai báo tiến trình

proctype name( /* formal parameter list */ )
{
/* các khai báo địa phương và các lệnh */

}

/* và */ quy định giới hạn chú thích trong promela
• Tiến trình init

8


Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.

Tất cả các chương trình promela đều cần một tiến trình init nó
giống như hàm main() trong ngơn ngữ C. Việc thực thi một chương
trình promela được bắt đầu từ tiến trình init.
Một tiến trình init có dạng:
init { /* Các khai báo địa phương và các biểu thức. */ }
Đơn giản nhất có thể là chương trình promela có dạng:
init { skip }
Skip có nghĩa là khơng có biểu thức nào trong tiến trình init;
Mỗi tiến trình được định nghĩa bởi một proctype, nó được thực thi đồng
thời với tất cả các tiến trình khác, nó giao tiếp với các tiến trình khác thơng qua
việc sử dụng các biến cơng cộng hoặc các kênh. Tiến trình thực thi sau khi thực
hiện hàm run.
Một số ví dụ đơn giản về tiến trình
proctype hello(){ printf("Hello") }
proctype world(){ printf("World\n") }
init { run hello(); run world () }
2.5

Lệnh và cấu trúc lệnh Promela
• Mỗi lệnh được ngăn cách với nhau một dấu chấm phẩy (;).
Một số lệnh và cấu trúc tiêu biểu
• Skip: khơng thực hiện, chỉ thay đổi khi tiến trình gọi tới

• Printf: In ra màn hình.
• Assert(Exp) : Sử dụng kiểm tra nếu Exp là biểu thức hợp lệ
(Nếu giá trị Exp = 0 thì thực thi sẽ bị lỗi).
• Cấu trúc lặp (do)
Cú pháp:

if

9


Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.

:: choice1 -> stat1.1; stat1.2;
:: choice2 -> stat2.1; stat2.2;
:: ..........................................
:: choicen -> statn.1; statn.2;
fi;
Lựa chọn một trong các điều kiện thực thi

• Cấu trúc so sánh (if)
do
:: choice1 -> stat1.1; stat1.2;
:: choice2 -> stat2.1; stat2.2;
:: ...........................................
:: choicen -> statn.1; statn.2;
od;
Lựa chọn được lặp đi lặp lại nhiều lần và có thể dừng nếu gặp break.
• Cú pháp Active
Từ khóa Active có thể là tiền tố cho mọi thủ tục được khai báo trong

hàm.
Hiệu quả của từ khóa active là tạo ra liên kết Prototype trong hệ thống
ban đầu
Nhiều trường hợp của cùng một khai báo Prototype có thể được tạo ra
bằng cách sử dụng một mảng các hậu tố tùy chọn. Ví dụ :
active [4] proctype hello(){ printf("Hello") }
active [7] proctype world(){ printf("World\n") }
Lưu ý: trường hợp này sẽ tạo ra 4 trường hợp của “Hello” và
7 trường hợp của “World”
• Cú pháp Atomic
Có thể sử dụng tới một nhóm lệnh trong một thơng báo atomic. Các
lệnh được thực hiện đơn lẻ và không xen kẽ với các lệnh trong tiến trình
khác.
Tự động phá vỡ nếu lệnh bị khóa khi đó các lệnh trong tiến trình khác
10


Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.

có thể xen kẽ vào giữa.
Cú pháp:
atomic { statement1; ...; statementn }
Statement1 chạy đầu tiên, statementn chạy cuối cùng.
• Cú pháp D-STEP
Nhiều phiên bản Atomic : Không chứa trạng thái trung gian được tạo
ra và lưu trữ.
Chỉ có thể chứa những bước xác định.
Thời gian chạy sẽ bị lỗi nếu Stat-I(I>1) bị chặn, khóa.
D-STEP cực kì hữu ích để thực hiện việc tính tốn trong q trình chuyển đổi
duy nhất.

Cú pháp:
d-step { statement1; ... ;statementn }
• Cú pháp TIME-OUT
Lệnh sẽ được thực thi nếu khơng có một lệnh khác trong các tiến trình
khác đang thực thi.
Giống như thời gian chờ của Hệ thống Spin sử dụng để giải quyết bế
tắc xung đột.
Nó khơng phải là một tính năng thời gian thực và có thể khơng được
sử dụng trong mơ hình times-outs tham gia vào thiết kế hệ thống.

2.6
thể

Sự khác biệt khi sử dụng 2 từ khóa Atomic, D-step trong bài tốn cụ
• Mơ hình

o Khi khơng sử dụng từ khóa trong chương trình

11


Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.

Hình 1: Khi khơng sử dụng từ khóa

Các trạng thái sinh ra khi khơng sử dụng từ khóa sẽ được tăng lên theo công
bội. Trong trường hợp này tất cả các trạng thái có thể tạo được từ chương
trình đều có thể sinh ra. Do đó những trạng thái không cần thiết mà vẫn
được lưu trữ trong bộ nhớ sẽ làm lãng phí một phần bộ nhớ và số lượng
trạng nhiều như vậy sẽ làm cho người thiết kế khó có thể kiểm sốt được.

o Khi sử dụng từ khóa Atomic

12


Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.

Hình 2: khi sử dụng từ khóa Atomic

Mặc dù câu lệnh Atomic sẽ không được chạy xen kẽ nhau nhưng các trạng
thái trung gian vẫn sẽ được khởi tạo và lưu trữ trong stack. Do đó khi có một
trạng thái trung gian (trạng thái A) bị khóa , ngắt thì lời gọi Atomic sẽ bị mất
và các trạng thái trung gian sẽ được đến thăm.
o Khi sử dụng từ khóa D-STEP

13


Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.

Hình 3: khi sử dụng từ khóa D-Step

Khác với từ khóa Atomic, từ khóa D-Step thực thi một mã lênh nếu một bước
hay giao dịch nào bị khóa thì chương trình sẽ bị lỗi. Các trạng thái trung gian
sẽ khơng được khởi tạo.
• Một chương trình đơn giản để kiểm tra chức năng khi sử dụng các từ
khóa
o Mã lệnh: Khi khơng sử dụng từ khóa nào.

14



Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.

int x=0
int y=0;int z=0
proctype A(){
printf("gia tri x1= %d\n", 1);
printf("gia tri y1= %d\n", 1);
printf("gia tri z1= %d\n", 1);
}
proctype B(){
printf("gia tri x2= %d\n", 2);
printf("gia tri y2= %d\n", 2);
printf("gia tri z2= %d\n", 2);
}
init {
run A();
run B();
}
Hình 4: Chương trình khơng sử dụng lệnh Atomic, D-step

Khi khơng sử dụng từ khóa nào thì số các trạng thái sinh ra trong ví dụ trên sẽ
là 9 trường hợp. Do các câu lệnh trong hai tiến trình sẽ chạy xen kẽ với nhau.
o Mã lệnh: Khi sử dụng từ khóa atomic hoặc D-step
Do chức năng của mã lệnh atomic và D-step là tương đối giống nhau chỉ
khác nhau đôi chút về trạng thái trung gian được khởi tạo.
Atomic : Khởi tạo trạng thái trung gian nhưng chỉ lưu vào stack. Cho
đến khi nào có một trạng thái bên trong mã lệnh atomic bị khóa,
ngắt thì mới thực hiện các trạng thái trong Stack.

D-step: Không khởi tạo trạng thái trung gian nên khi có một trạng
thái nào bên trong mã lệnh D-step bị khóa thì chương trình thực thi
sẽ bị lỗi.

15


Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.

int x=0
int y=0;
int z=0
proctype A(){
atomic{
printf("gia tri x1= %d\n", 1);
printf("gia tri y1= %d\n", 1);
printf("gia tri z1= %d\n", 1);
}
}
proctype B(){
printf("gia tri x2= %d\n", 2);
printf("gia tri y2= %d\n", 2);
printf("gia tri z2= %d\n", 2);
}
init {
run A();
run B();
}

Hình 5: Khi sử dụng từ khóa Atomic, D-step


Trong trường hợp này thì số các trạng thái sinh ra sẽ giảm đi bởi vì khi
bắt đầu đến trạng thái x1 thì chương trình phải chạy hết đến trạng thái x3 rồi
mới xen kẽ tới các trạng thái khác được. Dựa vào đặc điểm này mà người
kiểm thử có thể loại bớt đi được khá nhiều các trạng thái không cần thiết.

16


Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.

CHƯƠNG 3
3.1

TRÌNH BÀY CƠNG CỤ SPIN, THAM SỐ, CÚ PHÁP LỆNH
Sơ lược về công cụ spin

SPIN là công cụ mã nguồn mở, phổ biến và được sử dụng bởi hàng
ngàn người trên toàn cầu.
SPIN được sử dụng cho việc xác minh thẩm định của các hệ thống
phân phối phần mềm.
Nó cung cấp một giả lập cho phép các nhà thiết kế đạt được kết quả
phản hồi từ hệ thống mơ hình của họ. Những kết quả phản hồi đó đóng vai trị
quan trọng trong sự hiểu biết của các nhà thiết kế về hệ thống trước khi họ
đầu tư vào phân tích chính thức.
3.2

Lịch sử phát triển cơng cụ SPIN

Từ năm 1980 Spin được phát triển tại Bell Labs của nhóm Unix Phần

mềm này phát triển rộng rãi từ năm 1991.
Tháng 4 năm 2002 Spin được trao giải thưởng phần mềm uy tín cho
năm 2001 của ACM.
Các version chính: năm 1991 là 1.0 (initial version) tới năm 2002 đã có
SPIN version 4.0 (automata extration from C code).

3.3

1.0
2.0
3.0

Jan 1991
Jan 1995
Apr 1997

4.0

Late 2002

5.0
6.0

Oct 2007
Dec 2010

Initial version (Holzmann 1991
Partial order reduction
Minimised
automaton

representation
Ax: automata extraction from C
code
Multi-core & swarm support
Inline LTL formula parallel bfs

Một số yếu tố thành công của SPIN
Cú pháp thực hiện (bằng cách sử dụng tựa ngôn ngữ C).

17


Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.

Giao diện người dùng đồ họa đẹp Xspin.
Không chỉ là một cơng cụ nghiên cứu, mà cịn là cơng cụ hỗ trợ.
Chứa nhiều hơn so với nhiều thập kỷ nghiên cứu kéo xác minh máy
tính tiên tiến AIDEC (nhiều thuật tốn tối ưu hóa).

3.4

Kiến trúc SPIN – Cấp độ tổ chức Spin

Hình 6: Cấp độ tổ chức SPIN

3.4

Cơng cụ dòng lệnh.

3.4.1 Cú pháp Spin

Một số câu lênh trong SPIN.
Spin –a [-m] [-Pcpp] file
spin [-bglmprsv] [-J] [-qN] [-nN] [-Pcpp] file
spin -c [-t] [-Pcpp] file
spin -d [-Pcpp] file
spin -f LTL
spin -F file
18


Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.

spin -i [-bglmprsv] [-J] [-qN] [-Pcpp] file
spin -M [-t] [-Pcpp] file
spin -o1 -o2 -o3 file
spin -t[N] [-bglmprsv] [-J] [-qN] [-Pcpp] file
spin –V

3.4.2 Tùy chọn và chức năng của mỗi lệnh
Bắt đầu bằng việc viết một chương trình có vai trị như một mơ hình hệ
thống cần được kiểm thử (được viết bằng ngơn ngữ Promela).
Ví dụ: trong bài trình bày của nhóm em, em sử dụng counter.plm làm
file đầu vào. Nó đóng vai trị là mơ hình hệ thống được kiểm thử.
• Gỡ lỗi chương trình.
Chạy 2 câu lệnh sau:
$spin –c spec.pml
$spin –p spec.pml

Hai câu lệnh sẽ chạy mô phỏng mơ hình. Câu lệnh đầu tiên sẽ tính tốn
và cho ta đầu ra của hệ thống từ những đầu vào được khai báo trong mơ

hình. Câu lệnh thứ hai cho ta quá trình mà hệ thống thay đổi theo khi
chạy mơ hình.
Thực hiện debugged bằng dịng lệnh:
$spin –a counter.pml

# generate verifier

Đầu ra file pan.c mô tả hệ thống bằng ngơn ngữ C hồn tồn tự động.


Biên dịch file pan.c. Lúc này, quyết định quan trọng là chọn xác minh
đầy đủ (Exhaustive verification) (CPU-time or memory) hoặc xác minh
không đầy đủ (Supertrace verification).
Xác minh không đầy đủ (Exhaustive verification)
Sẽ là tối ưu nhất khi sử dụng tham số -o2 –o, thời gian chạy xác minh
có thể chỉ cịn một nửa so với cách sử dụng các tham số khác

$ gcc -O2 -o pan pan.c

# default compilation

19


Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.

Nếu đã biết bao nhiêu phần của bộ nhớ vật lý được sử dụng thì có thể
sử dụng cú pháp sau: ví dụ có 256 Mb cho việc biên dịch, câu lệnh
được thực hiện sẽ là.
$ gcc -O2 -DMEMLIM=256 -o pan pan.c


# memory bound 256Mb

Nếu việc xác minh vẫn chạy ra khỏi bộ nhớ, có thể sử dụng nén thay vì
tăng giới hạn bộ nhớ:
$ gcc -O2 -DMEMLIM=256 --DCOLLAPSE -o pan pan.c # collapse
compression

Nếu vẫn là vượt quá giới hạn bộ nhớ thì sẽ sử dụng lựa chọn thứ hai
(Supertrace verification).
$ gcc -O2 -DMEMLIM=256 -DBITSTATE -o pan pan.c
#
supertrace algorithm

• Thực hiện việc xác minh tối ưu.
o Một xác minh đầy đủ
$

./pan

o Một xác minh không đầy đủ
-

Đối với chu kì acceptance cycles, sử dụng tham số -a:
Đối với chu kì non-progress cycles:

$ gcc -O2 -DNP -o pan pan.c

Hoặc:


$ gcc -O2 -DNP -DBITSTATE -o pan pan.c

Tiếp theo là:

$ ./pan -l
-

Đối với chu kì non-progress cycles:

$ gcc -O2 -DSAFETY -o pan pan.c

Hoặc:

$ gcc -O2 -DSAFETY -DBITSTATE -o pan pan.c

o Có thể xác minh dựa độ xâu tìm kiếm
$ . / Pan-m100000

Hoặc

$ . / Pan-m100000

20


Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.



Sau khi thực hiện một loạt các hoạt động xác minh trên, có thể vào file

‘spec.pml.trail ‘ với ‘spec.pml’ là tên đầu vào PROMELA để xem các lỗi
nhận được sau khi debug.
o Để kiểm tra nguyên nhân gây ra lỗi sử dụng tham số -t.

$ Spin-t-c spec.pml
$ Spin-t-M spec.pml
$ Spin-t-r-s-l-g spec.pml



Sinh test case
Mơ hình SPIN và file thực thi pan sẽ cho ra một bộ test case một cách tự
động . SPIN gán số đầu vào cho tất cả các dòng lệnh. Đầu ra của hệ
thống với số liệu đầu vào trước đó được liệt kê, giúp theo dõi những gì
xảy ra của hệ thống. Sử dụng tham số -d để xem thịi gian và q trình
chạy của hệ thống.

$ pan -d
# print state machines
$ pan -d -d # print full, unoptimized state machines

3.4.3 Một ví dụ đơn giản.
Code và hướng dẫn thực thi được gửi kèm tài liệu báo cáo.
3.4.4 SPIN và công cụ giao diện đồ họa khác.
Hơn hai thập kỉ được nghiên cứu và phát triển, SPIN được phát triển
mạnh mẽ. Các cơng cụ có giao diện đồ họa giúp tiếp cận với SPIN cũng ra đời
và phát triển không ngừng.
Phải kể đến jSPIN, iSPIN, xSPIN. Mỗi cơng cụ kể trên đều có những
lợi thế nhất định để các nhà kiểm thử hệ thống lựa chọn cho cơng việc chun
mơn của mình.

3.4.5 Hướng dẫn cài đặt SPIN
Tải về một phiên bản của SPIN từ trang chủ
Đổi tên file tải về thành spin.exe.
Tải và cài đặt một trình biên dịch C. Trong bài trình bày này, chúng em sử
dụng Cygwin Net Release Setup Program. Có thể tải về từ địa chỉ sau:
/>Copy spin.exe vào thư mục bin, nơi cài đặt Cygwin. VD:
C:\cygwin\bin.

21


Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.

CHƯƠNG 4

GIỚI THIỆU CÔNG CỤ SOẠN THẢO EMACS
Emacs là tên của một họ các trình soạn thảo văn bản. Đặc trưng bởi
khả năng mở rộng của nó. Phát triển bắt đầu vào giữa những năm 1970 và
tiếp tục phát triển tới năm 2012. Emacs có hơn 2.000 lệnh được xây dựng và
cho phép người sử dụng kết hợp các lệnh này vào macro để tự động hóa
cơng việc, đặc biệt với việc sử dụng Emacs Lisp, một biến thể của Lisp, cung
cấp một khả năng mở rộng sâu.
4.1

Khái niệm và chức năng của GNU Emacs
• GNU Emacs là trình soạn thảo văn bản.
• Tự do sao chép và phân phối lại.
• Có thể chạy trên nhiều hệ điều hành.
• Có thể mở rộng: khơng chỉ thay đổi các xác lập cá nhân mà cịn có
thể tạo ra những chức năng mới.


4.2

Các loại trình soạn thảo Emacs

Emacs nguyên thuỷ được viết bằng ngơn ngữ lập trình của trình soạn
thảo văn bản TECO, và chạy trên DEC PDP-10 và -11. Emacs đầu tiên cho
các máy Unix là Gosling Emacs, sau này được thương mại hoá với tên
Unipress Emacs. GNU Emacs được viết bởi Richard Stallman, tác giả chính
của TECO Emacs nguyên thuỷ. u cầu chính để một trình soạn thảo văn bản
được gọi là “emacs” là nó có thể được mở rộng đầy đủ với một ngơn ngữ lập
trình thực, khơng đơn thuần là một ngôn ngữ macro. Đối với GNU Emacs,
ngôn ngữ này là Lisp.

22


Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.

Hình 7: Quá trình phát triển của Emacs
4.3

Bộ gõ phím

4.3.1 Bàn phím và bộ kí tự
Tất cả các lệnh của Emacs dùng bộ kí tự ASCII 8 bit.
4.3.2 Kí hiệu
C-x: Kí tự Control-x, với x là phím bất kì.
M-x: Kí tự Meta-x, với x là phím bất kì.
C-M-x: Kí tự Control-Meta-x, với x là phím bất kì.

RET: Phím return (thực ra là C-m).
SPC: Thanh khoảng trắng (space bar).
ESC: Phím escape, hay tương đương, C-[
4.4

Giao diện trình soạn thảo Emacs

23


Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.

Hình 8: Giao diện trình soạn thảo Emacs
4.5

Cấu trúc lệnh Emac.

Đối với Emacs, mỗi gõ phím (keystroke) thực ra là một lệnh, ngay cả
các gõ phím đơn giản như các chữ cái A và z: in các ký tự là lệnh điền chúng
vào. Các ký tự không in (non-printing) là các lệnh soạn thảo, tức dùng để di
chuyển con trỏ, cuộn văn bản, xoá hoặc sao chép văn bản, v.v.
Mỗi lệnh có một tên dài, như kill-line, delete-backward-char, hay selfinsert-command. Các lệnh này được liên kết (bind) với một gõ phím để thuận
tiện khi soạn thảo. Mỗi cặp gõ phím và lệnh được gọi là liên kết phím (key
binding), hoặc gọi tắt là liên kết (binding).
Bộ các liên kết tạo thành bộ lệnh Emacs. Tuy nhiên, chúng có thể được
mở rộng và được thay đổi tuỳ thích.
4.6

Các phím đơn.


95 ký tự ASCII in được, chúng liên kết với self-insert-command để
được điền vào văn bản khi được gõ.Các ký tự điều khiển: C-a, C-b,...: 32 kí tự
soạn thảo. Meta để sử dụng thêm 128 ký tự ở nửa trên của ASCII cho các lệnh
soạn thảo:
• M-a, M-b,... (cũng có M-A là một kí tự riêng biệt, nhưng để giảm
thiểu nhầm lẫn các kí tự meta chữ hoa được coi như các kí tự meta
chữ thường tương ứng.)
• C-M-a (tương đương với M-C-a),... (giữ Control và Meta đồng thời
và gõ phím kia.)
24


Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.

4.6

Các phím tiền tố và tổ hợp.

Lệnh tiền tố (prefix command) là một gõ phím đợi một kí tự khác được
gõ, tạo thành một cặp gõ phím liên kết với một lệnh. Lệnh tiền tố thường
nhóm các lệnh có liên hệ với nhau. Các lệnh tiền tố tiêu chuẩn là:
• C-c: Dùng cho các lệnh đặc hiệu cho các chế độ (mode) cụ thể.
• C-h: Dùng cho các lệnh giúp đỡ.
• C-x: Chủ yếu dùng cho các lệnh thao tác trên tập tin, bộ đệm và cửa
sổ.
Một lệnh của lệnh tiền tố cũng có thể liên kết với một lệnh tiền tố khác.
4.7

Tệp tin, bộ đệm và cửa sổ


4.7.1 Tệp tin, bộ đệm và cửa sổ
Emacs có 3 (thực ra là 4) cấu trúc dữ liệu liên quan mật thiết với nhau:
• Tập tin
Tập tin là tập tin Unix thực sự trên đĩa. Bạn không bao giờ biên tập trực
tiếp trên tập tin này. Emacs đọc tập tin vào bộ đệm và viết một bộ đệm vào
tập tin để lưu nó.
• Bộ đệm (buffer)
Bộ đệm là cấu trúc dữ liệu nội tại giữ văn bản bạn thực sự biên tập.
Emacs có thể có con số bộ đệm bất kì tại bất kì thời điểm nào. Hầu hết,
nhưng khơng phải tất cả, các bộ đệm liên hệ với một tập tin. Bộ đệm có
tên; một bộ đệm xuất phát từ một tập tin gần như luôn luôn mang tên của
tập tin đó, và chúng ta nói rằng bộ đệm đangviếng thăm tập tin. Điều này
có nghĩa là khi bạn lưu bộ đệm, nó sẽ được lưu vào tập tin đúng. Vào bất
cứ lúc nào cũng chỉ có đúng một bộ đệm được chọn: đây là bộ đệm mà con
trỏ phần cứng đang hoạt động và là nơi mà lệnh sẽ có tác dụng. Bộ đệm có
thể được xố theo ý muốn; xố bộ đệm khơng xố tập tin trên đĩa (mặc dù
bạn có thể mất các thay đổi đã thực hiện nếu bạn khơng lưu trước).
• Cửa sổ
Cửa sổ là nơi bạn xem bộ đệm. Vì giới hạn thực thể của màn hình, có
thể bạn khơng có chỗ để xem tất cả các bộ đệm cùng lúc. Bạn có thể chia
nhỏ màn hình, ngang hay dọc, thành nhiều cửa sổ, mỗi cửa sổ xem một bộ
25


×