Tính cấp thiết của luận án Một cách tổng quát, với mỗi kỹ thuật được dùng trong một giai đoạn kiểm thử động dynamic time testing thì bất cứ phần mềm nào cũng có thể được phân ra làm hai
Trang 1-
Tô Hữu Nguyên
MỘT SỐ CẢI TIẾN VỀ RÀNG BUỘC XÂU TRONG SINH DỮ LIỆU KIỂM THỬ TỰ
VÀ CÔNG NGHỆ VIỆT NAM
HỌC VIỆN KHOA HỌC VÀ CÔNG NGHỆ
Trang 2Nam
Người hướng dẫn khoa học 1: TS Nguyễn Trường Thắng
Người hướng dẫn khoa học 2: PGS.TS Đặng Văn Đức
Có thể tìm hiểu luận án tại:
- Thư viện Học viện Khoa học và Công nghệ
- Thư viện Quốc gia Việt Nam
Trang 3MỞ ĐẦU
1 Tính cấp thiết của luận án
Một cách tổng quát, với mỗi kỹ thuật được dùng trong một giai đoạn kiểm thử động (dynamic time testing) thì bất cứ phần mềm nào cũng có thể được phân ra làm hai công đoạn con: chuẩn bị các ca kiểm
run-thử (test case) cho việc kiểm tra phần mềm và thực hiện chạy chương trình cần kiểm run-thử trên một nền tảng
hỗ trợ các nghiệp vụ kiểm thử (testing framework) với các ca kiểm thử đã có
Một trong các hoạt động quan trọng để giảm chi phí kiểm thử phần mềm là sinh các ca kiểm thử một cách tự động và có tính đầy đủ Các tổ chức phát triển phần mềm thường phải chi phí một lượng lớn về tài chính cho các hoạt động liên quan đến kiểm thử phần mềm Tính hiệu quả của tiến trình xác minh và thẩm định phụ thuộc nhiều vào số lỗi được tìm ra và được sửa chữa trước khi sản phẩm được chuyển giao Điều này đồng nghĩa với quan điểm chất lượng của phần mềm phụ thuộc chặt chẽ vào chất lượng các ca kiểm thử được sinh ra
Trong những năm qua, nhiều nghiên cứu của các nhà khoa học trên thế giới nhằm “sinh dữ liệu kiểm thử một cách tự động” [3, 4] để giảm thiểu chi phí cho phần mềm Có hai cách tiếp cận căn bản để sinh dữ liệu kiểm thử đó là dựa vào mã nguồn (code) và dựa vào mô hình (model) Đối với phương pháp dựa vào mã nguồn là phương pháp cho khả năng bao phủ cao, có khả năng loại bỏ các dòng lệnh không cần thiết chứa các tiềm ẩn gây lỗi nhưng cần thiết phải có khả năng tối ưu tính toán của các phần mềm phân tích kiểm thử,
do vậy gần đây có nhiều nghiên cứu tập trung vào phương pháp này [5, 6, 7]
Trong những năm qua, nhiều nghiên cứu về việc sinh các ca kiểm thử một cách tự động như: sinh các ca kiểm thử dựa vào đặc tả, sinh các ca kiểm thử dựa vào mô hình, sinh ca kiểm thử hướng đường dẫn và
kỹ thuật thông minh Tuy nhiên, kiểm thử dựa vào thực thi biểu trưng đã và đang là hướng nghiên cứu được nhiều người quan tâm Các kỹ thuật cơ bản sinh dữ liệu kiểm thử tự động mà các nhà nghiên cứu đã đề xuất
đó là: Dựa vào chứng minh định lý (test case generation by theorem proving) [8, 9]; Dựa vào thực thi biểu trưng (test case generation by symbolic execution [5, 7,10,11,12]); Dựa vào kiểm chứng mô hình (test case generation by model checking) [13]; Dựa vào một mô hình luồng sự kiện (test case generation by an event-flow model [14]); Dựa vào việc sử dụng mô hình xích Markov (test case generation by using a Markov chains model) [15] Trong đó kỹ thuật thực thi biểu trưng (symbolic execution) đang là vấn đề được nhiều nhà khoa học trên thế giới tìm hiểu, phát triển và xây dựng các ứng dụng [5, 6, 7] Hiện nay kỹ thuật này đã
và đang được phát triển trên nhiều công cụ, nhiều ngôn ngữ như: C/C++, JavaScrip, Net, java, HTML vv Trong phạm vi giới hạn nghiên cứu, nội dung của luận án tập trung nghiên cứu về một số cải tiến trong bộ giải ràng buộc xâu áp dụng sinh các ca kiểm thử Các cài đặt thực nghiệm và đánh giá được thực hiện bằng ngôn ngữ Java do Java là ngôn ngữ mạnh mẽ, hiện đại Hơn nữa, Java đang được sử dụng rộng rãi với các thư viện trên kiểu dữ liệu xâu đa dạng, phong phú và được sử dụng trong nhiều dự án lớn trong hiện tại và tương lai
2 Mục tiêu nghiên cứu của luận án
Nghiên cứu các phương pháp mô hình hóa ràng buộc giải ràng buộc từ dó cải tiến khả năng giải ràng buộc và áp dụng kỹ thuật thực thi biểu trưng trong tự động sinh các ca kiểm thử Cài đặt thử nghiệm các phương pháp đề xuất trong sinh tự động các ca kiểm thử trên kiểu dữ liệu xâu và kiểu dữ liệu hỗn hợp Phân tích, đánh giá kết quả sau khi thử nghiệm
Trang 4Tổng quan về các phương pháp tự động sinh các ca kiểm thử phần mềm, kỹ thuật thực thi biểu trưng
và ứng dụng trong sinh tự động các ca kiểm thử Các kỹ thuật mô hình hóa ràng buộc, giải ràng buộc trên các kiểu dữ liệu dựa trên hai phương pháp Otomata và Bitvector, Nghiên cứu, phân tích đánh giá các phương pháp hiện có sinh ca kiểm thử trên các kiểu dữ liệu khác nhau Đánh giá hiệu quả, chất lượng của các ca kiểm thử được tạo ra so với thực tế chương trình
Các kỹ thuật sinh tự động các ca kiểm thử, các vấn đề liên quan mô hình hóa ràng buộc trên các kiểu
dữ liệu Nghiên cứu cải tiến mô hình hóa và giải ràng buộc trên kiểu dữ liệu xâu kí tự, từ đó ứng dụng trong
kỹ thuật thực thi biểu trưng thực hiện sinh các ca kiểm thử tự động trên kiểu xâu kí tự cho các chương trình kiểm thử
Nghiên cứu, phân tích, tổng hợp các liệu liên quan đến thực thi biểu trưng, vai trò của giải ràng buộc cũng như giải ràng buộc trên kiểu dữ liệu xâu trong thực thi biểu trưng trong sinh tự động các ca kiểm thử (các bài báo, tạp chí, trên mạng Internet ) Cải tiến mô hình hóa ràng buộc và nâng cao khả năng giải ràng buộc trên kiểu dữ liệu xâu và ràng buộc hỗn hợp, phân tích, đánh giá các kết quả đã công bố
3 Các nội dung nghiên cứu chính của luận án
Xây dựng mô hình hóa ràng buộc trên kiểu dữ liệu xâu và ràng buộc hỗn hợp, cải tiến khả năng giải ràng buộc trong phương pháp thực thi biểu trưng Cài đặt kỹ thuật mô hình hóa và giải ràng buộc dựa trên Otomat và Bitvector trong giải ràng buộc xâu, đánh giá so sánh các kết quả thu được với các các kết quả đã công bố, luận án có bố cục cụ thể như sau:
Chương 1 của luận án trình bày tổng quan về kiểm thử phần mềm và kỹ thuật thực thi biểu trưng ứng dụng trong tự động sinh các ca kiểm thử Đồng thời trình bày các lý thuyết cơ sở sử dụng trong luận án nhằm đưa ra cái nhìn tổng quan về bài toán nghiên cứu, về sử dụng kỹ thuật thực thi biểu trưng ứng dụng trong sinh tự động các ca kiểm thử và hướng nghiên cứu cụ thể của luận án
Chương 2 của luận án trình bày kết quả nghiên cứu về các phương pháp mô hình hóa ràng buộc, giải ràng buộc trong thực thi biểu trưng Áp dụng các công cụ này vào các trường hợp cụ thể cùng với các đánh giá tính hiệu quả của các phương pháp này trên kiểu dữ liệu cụ thể
Chương 3 của luận án trình bày các kết quả nghiên cứu của các cải tiến mô hình hóa ràng buộc trên kiểu xâu và ràng buộc hỗn hợp, giải ràng buộc trong thực thi biểu trưng trên kiểu dữ liệu xâu và dữ liệu hỗn hợp Đồng thời trình bày việc mở rộng kỹ thuật thực thi biểu trưng, cách thực hiện giải ràng buộc xâu dựa trên phương pháp Otomat
Phần kết luận nêu những đóng góp, hướng phát triển, những vấn đề quan tâm; danh mục các công trình đã được công bố của luận án và danh sách các tài liệu tham khảo được sử dụng trong luận án cũng được trình bày
CHƯƠNG 1 TỔNG QUAN VỀ KIỂM THỬ PHẦN MỀM VÀ THỰC THI BIỂU TRƯNG
Chương này trình bày lý thuyết tổng quan về kiểm thử và sinh dữ liệu kiểm thử, thực thi biểu trưng
và ứng dụng của thực thi biểu trưng trong sinh các ca kiểm thử Trong đó, trình bày các khái niệm cơ bản và các phân tích liên quan đến kỹ thuật thực thi biểu trưng Đồng thời, một vài thách thức và hướng phát triển của luận án cũng được trình bày trong chương này
1.1 Kiểm thử phần mềm
Để đảm bảo một hệ thống phần mềm hoặc các thành phần của phần mềm làm việc như mong muốn là một thách thức lớn trong ngành công nghiệp phần mềm Các phần mềm lỗi gây ra những tổn thất về kinh tế cũng như những hậu quả nghiêm trọng khác tùy thuộc vào lĩnh vực mà phần mềm được sử dụng
Trang 51.1.2 Các kỹ thuật kiểm thử [24]:
Kiểm thử hộp đen (Black box testing)
Kiểm thử hộp trắng (White box testing)
Kiểm thử đơn vị (Unit test)
1.2 Kỹ thuật kiểm thử hộp trắng dòng điều khiển
Kiểm thử hộp trắng dòng điều khiển chia ra gồm kiểm thử hướng tĩnh và kiểm thử hướng động Đầu vào của hai kĩ thuật này đều là mã nguồn và tiêu chí phủ kiểm thử Sau một loạt quá trình phân tích, đầu ra tương ứng là tập ca kiểm thử Mỗi một kĩ thuật đều có những ưu điểm và hạn chế riêng Mục tiêu của kiểm thử hộp trắng dòng điều khiển là tìm tập ca kiểm thử tối thiểu nhưng đạt được độ phủ tối đa
1.3 So sánh kiểm thử hộp trắng dòng điều khiển theo hướng tĩnh và động
Mỗi một kĩ thuật kiểm thử đều có những ưu điểm và hạn chế riêng Để có cái nhìn tổng quan về hai
kĩ thuật, luận án đưa ra sự so sánh về số ca kiểm thử, thời gian sinh ca kiểm thử, khả năng kiểm thử vòng lặp, ảnh hưởng bởi phức tạp mã nguồn đối với hai kĩ thuật
1.4 Thách thức trong kiểm thử phần mềm
Tồn tại các ý tưởng không đúng về kiểm thử như: Ca kiểm thử tốt luôn là ca kiểm thử có độ phức
tạp cao; Tự động kiểm thử có thể thay thế kỹ sư kiểm thử để kiểm thử phần mềm một cách tốt đẹp; Kiểm thử
phần mềm thì đơn giản và dễ dàng Ai cũng có thể làm, không cần phải qua huấn luyện
Ngoài ra, việc kiểm thử còn gặp nhiều hạn chế bao gồm: Không thể chắc là các đặc tả phần mềm
đều đúng 100%; Không thể chắc rằng hệ thống hay công cụ kiểm thử là đúng; Không có công cụ kiểm thử nào thích hợp cho mọi phần mềm; Kỹ sư kiểm thử không chắc rằng họ hiểu đầy đủ về sản phẩm phần mềm; Không bao giờ có đủ tài nguyên để thực hiện kiểm thử đầy đủ phần mềm; Không bao giờ chắc rằng ta đạt đủ 100% hoạt động kiểm thử phần mềm
1.5 Thực thi biểu trưng
1.5.1 Tổng quan về thực thi biểu trưng
Trong khoa học máy tính, thực thi biểu trưng là một phương tiện để phân tích một chương trình để xác định đầu vào nào gây ra mỗi phần của chương trình để thực thi Một bộ biên dịch theo chương trình, giả sử nhận các giá trị biểu trưng cho các đầu vào thay vì nhận các đầu vào thực tế như thực thi bình thường của chương trình
1.5.2 Thực thi biểu trưng tĩnh
Ý tưởng chính của thực thi biểu trưng [31] là thực thi chương trình với các giá trị biểu trưng thay vì các giá trị cụ thể của các tham số đầu vào
Giá trị biểu trưng của biến x có thể được biểu thị bởi:
(a) Một ký hiệu đầu vào
(b) Một biểu thức kết hợp giữa các giá trị biểu trưng bởi các toán tử,
(c) Một biểu thức kết hợp giữa giá trị biểu trưng và giá trị cụ thể bởi toán tử
1.5.3 Thực thi biểu trưng động
Thực thi biểu trưng động [32, 33] là kỹ thuật thực thi tượng trưng dựa trên phân tích chương trình động Thực thi biểu trưng động chính là sự kết hợp giữa thực thi cụ thể và thực thi biểu trưng Trong thực thi biểu trưng động, chương trình được thực thi nhiều lần với những giá trị khác nhau của tham số đầu vào
Trang 6Bảng 1.1 Ví dụ về thực thi biểu trưng động
null a = = null a!=null {} a!=null && !(a.length>0)
a!=null&& a.length>0 {0} a!=null && a.length>0
&& a[0]!=123456789 a!=null && a.length>0 &&
Bảng 1.2 So sánh thực thi Concolic với thực thi biểu trưng
- Sử dụng một đầu vào biểu trưng, thu tập và
giải ràng buộc với đầu vào biểu trưng
Thực thi biểu trƣng cổ điển
-Sử dụng một đầu vào cụ thể và chạy chương trình trong khi thu thập các ràng buộc đường dẫn đối với đầu vào đó
Thực thi Concolic
- Gọi bộ giải trên mọi điểm nhánh nên việc tiếp
cận các phần sâu của mã chậm hơn
- Biểu trưng cổ điển sẽ sử dụng ít tài nguyên hơn
khi muốn khám phá đầy đủ tất cả các đường
dẫn
- Chạy chương trình trong khi thu thập các ràng buộc đường dẫn Không can thiệp vào việc chạy chương trình nhiều – Nhanh
- Các phần sâu hơn của mã được thực thi trong mỗi lần lặp
– tiếp cận các phần sâu của mã nhanh hơn
- Thực hiện lại các bit bắt đầu của chương trình nhiều lần - không cần thiết
- Thực thi đồng thời có thể tốt hơn nếu bạn chỉ muốn tìm lỗi vì sẽ tiếp cận các phần sâu hơn của chương trình nhanh hơn
1.6.6 Ràng buộc xâu và vai trò của giải ràng buộc xâu
Mấu chốt của thực thi biểu trưng đó là khả năng giải ràng buộc và xâu dữ liệu là một kiểu dữ liệu cơ bản nó có trong tất cả các ngôn ngữ lập trình hiện đại và việc sử dụng các phép toán trên xâu là thường xuyên được thực hiện Trong các lĩnh vực khác nhau như phân tích phần mềm, kiểm chứng mô hình, cơ sở
dữ liệu, bảo mật web, tin sinh học [47 - 52] Vì lý do trên việc giải các ràng buộc phức tạp trên xâu là cần hiết và có rất nhiều ứng dụng
Các quan hệ được định nghĩa trên biến xâu kí tự bao gồm: Độ dài xâu, so sánh xâu, các phép nối, kiểm tra xâu con, cắt xâu, so sánh biểu thức chính quy vv
Thuật ngữ giải ràng buộc xâu (String Constraint Solving)trong luận án đề cập đến việc mô hình hóa,
và giải quyết các biểu thức kết hợp liên quan đến ràng buộc xâu, ta có thể xem như giải ràng buộc xâu như là phần giao giữa giải ràng buộc và tổ hợp các từ, trong đó người dùng sẽ đưa ra một vấn đề với các biến xâu và
Trang 7một bộ giải ràng buộc xâu sẽ tìm ra một giải pháp phù hợp cho vấn đề đó Từ những năm 2010 việc giải ràng buộc xâu đã có một số các nghiên cứu quan tâm có kết quả nhất định [51, 52] do nó có vai trò chủ đạo trong các lĩnh vực sinh dữ liệu kiểm thử, kiểm chứng mô hình, và bảo mật web
Trong những năm qua có nhiều hướng tiếp cận khác nhau đã được đưa ra, nhưng có ba loại chính: Tiếp cận dựa trên lý thuyết về Otomat: phương pháp này sử dụng một Otomat hữu hạn để biểu diễn giá trị của một biến xâu, nó được dùng để lưu trữ, xử lý các phép toán trên xâu
Tiếp cận dựa trên từ: Phương pháp này sử dụng hệ thống của so sánh từ với nhau, chúng sử dụng chủ yếu lý thuyết thỏa mãn (SMT)[53] để giải các ràng buộc xâu
Tiếp cận dựa trên phân tách xâu: Nguyên lý là thực hiện phân tách xâu thành các phần tử liền kề tương đương là các kí tự của xâu Xâu có thể phân rã thành các số nguyên hoặc bitvector
Bảng chữ cái hữu hạn là một tập hữu hạn Σ ={a 1 ,a 2 , a n} với n>1 các kí hiệu cũng được gọi là kí
tự Một xâu w hay một tự là một dãy hữu hãn các kí tự thuộc bảng chữ cái Σ, kí hiệu |w| biểu diễn cho độ dại của xâu w( trong luận án này không đề cập đến xâu có độ dài vô hạn) Một xâu rỗng được biểu diễn bởi ký tự
ɛ, gọi tập hữu hạn Σ*là tập tất cả các xâu của bảng chữ cái Σ được định nghĩa đệ quy như sau:
Xâu rỗng: ɛ ∈ Σ *
Nếu kí tự a∈ Σ và w∈ Σ* thì thì wa∈ Σ *
Ngoài ra không có gì thuộc Σ *
Bảng 1.4 Mô tả ràng buộc xâu
x = y, x ≠ y So sánh bằng, so sánh khác
x < y, x≤y, x≥y, x > y So sánh thứ tự logic của hai xâu
n=|x| So sánh độ dài xâu với một số nguyên n
z=x.y, y=x n Phép nối xâu, phép lặp của phép nối xâu
y=x -1 Phép đảo ngược xâu
y=x[i j] Lấy về xâu con của xâu x
n=find(x,y) n là chỉ số đầu tiên xuất hiện của xâu x trong xâu
y
y = replace(x, q, q′ ) y có được bằng cách thay thế lần xuất hiện đầu
tiên của q bằng q‟ trong x
y = replaceAll(x, q, q′ ) y có được bằng cách thay thế tất cả q bằng q‟
trong x
n = count(a, x) n là số lần xuất hiện của kí tự a trong x
x ∈ L(R) x thuộc ngôn ngữ chính quy được biểu diễn bởi
R
x ∈ L(G) x thuộc ngôn ngữ phi ngữ cảnh được biểu diễn
bởi G
Ví dụ như ràng buộc substring(x,y) có nghĩa là xâu x phải là xâu con của xâu y có thể được định
nghĩa tương đương với ràng buộc find(x,y) được định nghĩa trong[54] cũng có thể tham chiếu tương đương với ràng buộc indexOf(y,x) Thứ tự của các kí tự trong xâu cũng tùy biến, trong một cách tiếp cận giải ràng buộc xâu thứ tự đầu tiên trong xâu được bắt đầu là 0 nhưng với một số cách tiếp cận thì nó là 1 khi đó kí tự
Trang 8đầu tiên của xâu lại là x[1] thay vì x[0] Nói tóm lại mục tiêu của giải ràng buộc xâu nhằm xác định xem có
tồn tại các giá trị của các biến xâu có thỏa mãn một biểu thức ràng buộc đã cho hay không và nhiệm vụ này
có thể được giải quyết bởi hai phương pháp là lập trình ràng buộc và lý thuyết thỏa mãn
1.6 Kết luận chương 1
Chương 1 của luận án đã trình bày các khái niệm nền tảng của nghiên cứu bao gồm các kỹ thuật kiểm thử phần mềm, các kỹ thuật cơ bản sinh dữ liệu kiểm thử tự động từ mô hình đang quan tâm Đồng thời cũng đã đánh giá so sánh các kỹ thuật kiểm thử hộp trắng theo hướng động và tĩnh, chỉ ra các thách thức về kiểm thử phần mềm chưa được giải quyết Trong đó kỹ thuật thực thi biểu trưng đang là vấn đề có triển vọng nghiên cứu Các kiến thức nền tảng và tổng quan về kỹ thuật thực thi biểu trưng cũng như các thách thức, các vấn đề chưa được giải quyết cũng được trình bày trong chương này
Các nội dung liên quan đến giải ràng buộc xâu ứng dụng trong sinh tự động các ca kiểm thử sẽ được trình bày trong các chương tiếp theo của luận án
CHƯƠNG 2 THỰC THI BIỂU TRƯNG VÀ MÔ HÌNH HÓA RÀNG BUỘC
Trong chương này, các khó khăn của kỹ thực thực biểu trưng sẽ được phân tích đánh giá Đồng thời, các công cụ mở rộng, cài đặt kỹ thuật thực thi biểu trưng mà nó sẽ được dùng để thực hiện cải tiến kỹ thuật
mô hình hóa ràng buộc kiểu xâu cũng được giới thiệu Ngoài ra, phương pháp mô hình hóa phục vụ cho cài đặt, đánh giá giải ràng buộc xâu và ràng buộc hỗn hợp cũng được trình bày trong chương này
Nội dung chương này được thể hiện trong các kết quả công bố [CT1], [CT2], [CT3] của tác giả
2.1 Những khó khăn và một vài giải pháp
Trong phần này, những khó khăn trong quá trình áp dụng thực thi biểu trưng được thảo luận và một vài giải pháp cho việc giải quyết các thách thức đặt ra được trình bày
2.1.1 Bùng nổ đường đi
Một trong những thách thức quan trọng của thực thi biểu trưng là nó sẽ sinh ra một số lượng lớn các đường thực thi mặc dù chương trình là nhỏ và thường là hàm mũ trong số các câu lệnh rẽ nhánh tĩnh của mã nguồn Kết quả là trong một khoảng thời gian định trước nó sẽ quyết định khám phá con đường đầu tiên sao cho phù hợp nhất
2.1.2 Mô hình hóa bộ nhớ
Độ chính xác của các câu lệnh của chương trình khi chuyển sang các ràng buộc biểu trưng có ảnh hưởng đáng kể đến độ bao phủ khi thực hiện thực thi biểu trưng cũng như khả năng giải các ràng buộc Ví dụ khi sử dụng mô hình hóa bộ nhớ mà xấp xỉ để thiết lập độ rộng cho tham biến kiểu Interger có thể có hiệu quả hơn trong thực tế nhưng mặt khác kết quả lại thiếu chính xác trong phân tích mã nguồn Nó phụ thuộc vào khoảng lựa chọn giá trị tương ứng như lỗi tràn bộ nhớ toán học, cũng có thể gây ra thiếu đường dẫn trong thực thi biểu trưng, hoặc khai phá những đường đi không khả thi vv
2 2 Thực thi biểu trưng và công cụ mở rộng
2.2.1 Thực thi biểu trưng và kiểm thử phần mềm
Kỹ thuật sinh dữ liệu kiểm thử sử dụng thực thi biểu trưng được cài đặt trên ngôn ngữ Java để sinh
dữ liệu kiểm thử cho các chương trình Tuy nhiên, hiệu năng công cụ hiện có còn hạn chế: thời gian thực thi khá lớn Việc áp dụng thuật toán tối ưu các ràng buộc - biểu diễn các lộ trình thực thi mã nguồn - nhằm giảm thời gian thực thi, nhưng vẫn đảm bảo hiệu quả bao phủ Giải pháp cải tiến được thử nghiệm trên tập các chương trình Java khác nhau và cho kết quả rất khả quan Nội dung phần này trình bày về JPF như khả năng kiểm tra của JPF, kiến trúc mức cao của JPF và khả năng mở rộng của JPF
Trang 92.2.2 Thực thi biểu trưng trên ngôn ngữ Java
Giới thiệu về Java PathFinder (JPF)
Ngày nay kỹ thuật thực thi biểu trưng cho phép thực hiện trên nhiều công cụ và ngôn ngữ khác nhau như là DART[36], CUTE[35] là các công cụ cho ngôn ngữ C/C++, hay PEX[36,37] cho các mã nguồn NET tuy nhiên trong luận án này lựa chọn sử dụng Path Finder cho ngôn ngữ Java Lý do là Java là ngôn ngữ độc lập với môi trường và có nhiều ứng dụng quan trọng được xây dựng trên nền tảng java, một lý do khác là công cụ JPF là một công cụ mạnh mẽ hỗ trợ cho kỹ thuật thực thi biểu trưng nó cho khả năng mở rộng và có một cộng đồng phát triển rộng rãi
JPF là một bộ kiểm chứng mô hình phần mềm trạng thái tường minh cho Java [68] Hiểu một cách
cơ bản JPF là một máy ảo thực thi chương trình Java không chỉ một lần (giống như các máy ảo thông thường), mà thực thi trong tất cả các nhánh, các đường đi có thể JPF sẽ kiểm tra các vi phạm thuộc tính như khóa chết hoặc các ngoại lệ không thể bắt được xuyên suốt các đường thực thi tiềm năng Hình 2.1 mô tả mô hình hoạt động của JPF
Hình 2.1 Mô hình hoạt động của JPF
Khả năng kiểm tra của JPF
JPF có thể kiểm tra tất cả các chương trình Java JPF có thể tìm ra các khóa chết hoặc ngoại lệ Ngoài ra chúng ta có thể tự phát triển mở rộng để kiểm tra các thuộc tính khác
Kiến trúc mức cao của JPF
JPF được thiết kế (như Hình 2.3) thành 2 thành phần chính đó là: JVM, và Search Trong đó, JVM là một bộ sinh trạng thái cụ thể Java Bằng việc thực hiện các chỉ thị Java bytecode Search chịu trách nhiệm lựa chọn trạng thái mà JVM nên xử lý, hoặc hướng JVM sinh trạng thái tiếp theo, hoặc yêu cầu JVM quay trở lại một trạng thái trước đó
Trang 10Hình 2.3 Biểu diễn sơ đồ kiến trúc mức cao của JPF
Các cài đặt chính của Search bao gồm tìm kiếm theo độ sâu (DFSearch) và HeuristicSearch
Trừu tượng hoá: Là quá trình loại bỏ các chi tiết không liên quan đến thuộc tính để có được các mô
hình hữu hạn đơn giản đủ để xác minh thuộc tính
Trừu tượng hoá dữ liệu: Hàm trừu tượng hoá h biến đổi từ S thành S‟ (Hình 2.4, 2.5)
Hình 2.4 Ví dụ về trừu tượng hoá dữ liệu
Trang 11Hình 2.5 Một ví dụ khác về trừu tượng hoá dữ liệu
Quy trình trừu tượng – sàng lọc dữ liệu (Hình 2.6):
Các bước thực hiện:
i Xây đựng mô hình trừu tượng hoá mới
ii Kiểm tra mô hình:
+ Nếu đạt yêu cầu thì không có lỗi,
+ Nếu không đạt yêu cầu, kiểm tra các ví dụ truy cập (Các truy cập hợp lệ sẽ có lỗi, các truy cập không hợp lệ sẽ có các gợi ý sàng lọc.)
Hình 2.6 Quy trình sàng lọc dữ liệu
Dựa trên các gợi ý sàng lọc, mô hình trừu tượng hoá mới sẽ được xây dựng
Quy trình này dừng trong các trường hợp không có lỗi hoặc có lỗi
Nhược điểm: Mất độ chính xác
Khả năng mở rộng của JPF
JPF có thể được coi như là một Framework mà tại đó bất kỳ nhà phát triển nào đều có thể mở rộng
để phục vụ cho một mục đích cụ thể JPF cung cấp một cơ chế mở rộng để cho phép thêm vào các chức năng mới mà không phải thay đổi trực tiếp cài đặt của Search hoặc JVM
Với kiến trúc mở rộng linh hoạt, hiện nay đã có một số mở rộng được phát triển cho JPF
Trang 122.3 Giải các ràng buộc và thực thi biểu trƣng
Liên quan đến sinh các ca kiểm thử, hướng tiếp cận dựa trên giải thuật di truyền đã được tìm hiểu trong công trình nghiên cứu CT[1] của nghiên cứu sinh Tuy nhiên, cách tiếp cận này thể hiện nhiều hạn chế
Mặc dù đã có những tiến bộ đáng kể trong kỹ thuật thực hiện giải các ràng buộc trong những năm gần đây, giúp cho thực thi biểu trưng trở nên thực tế hơn, nhưng việc giải các ràng buộc vẫn là cản trở đáng
kể của thực thi biểu trưng Nó thường chiếm nhiều thời gian trong quá trình thực hiện và là một trong những
lý do chính khiến thực thi tượng trưng không mở rộng được với một số loại chương trình mà mã nguồn của
nó sinh ra với yêu cầu rất lớn trong việc giải các ràng buộc
Kết quả là cần thiết phải thực hiện tối ưu khi giải các ràng buộc được sinh ra trong quá trình thực thi biểu trưng trong những chương trình thực tế Hai phương pháp tối ưu được sử dụng bởi các công cụ hiện tại bao gồm:
Loại bỏ ràng buộc không liên quan
Giải ràng buộc theo phương pháp gia tăng (Increamental Solving) [71]
Một trong những tính chất quan trọng của tập các ràng buộc được tạo ra trong quá trình thực thi biểu trưng là nó mô tả biểu diễn cho một tập các nhánh tĩnh từ mã nguồn của chương trình
Trong KLEE tất cả các kết quả truy vấn được lưu vào vùng nhớ đệm ánh xạ tập các ràng buộc và các giá trị cụ thể tìm được tương ứng với ràng buộc đó (trong trường hợp đặc biệt không có lời giải hoặc không thỏa mãn tương ứng với một kí hiệu đặc biệt)
2.4 Ràng buộc hỗn hợp và cải tiến trong giải ràng buộc xâu
Trên thực tế, kiểu dữ liệu xâu xuất hiện trong hầu hết các chương trình, đặc biệt là trong những đoạn chương trình hoặc phương thức nhằm “làm sạch” xâu dùng cho dữ liệu đầu vào của các chương trình nhằm kiểm tra tính hợp lệ cũng như phát hiện và loại bỏ các nội dung độc hại Với một thư viện rộng lớn, kiểu dữ liệu xâu trong ngôn ngữ Java còn ẩn chứa nhiều lỗi
Với mong muốn hoàn thiện khả năng kiểm thử và phát hiện lỗi trên những chương trình Java có sử dụng kiểu dữ liệu xâu, nội dung luận án quan tâm đến việc xác định lỗi để có những phần mềm hoàn thiện hơn Áp dụng kiểm thử phần mềm sử dụng kiểu dữ liệu xâu nhằm tăng khả năng bao phủ hướng tới nâng cao chất lượng phần mềm
Tại sao thực thi biểu trưng trên kiểu dữ liệu xâu lại khó khăn?
Các phép toán xâu là sự trộn lẫn giữa hai miền giá trị, cụ thể là xâu và số nguyên Ví dụ phép toán
lấy kí tự thứ n của xâu Hiện tại những giải pháp được đưa ra để thực thi biểu trưng cho kiểu dữ liệu xâu
nhưng nó mới chỉ dừng lại ở việc chỉ hỗ trợ một tập con các phép toán đó hoặc thường là không có gì đáng
kể Ta thực hiện cách tiếp cận lặp đi lặp lại, trong đó đầu tiên ta thực hiện giải các ràng buộc trên kiểu dữ liệu
số nguyên, sau đó sử dụng kết quả đó để giải ràng buộc xâu và nếu nó được thỏa mãn thì công việc được hoàn thành Mặt khác các ràng buộc kiểu nguyên được thêm vào bổ sung và quá trình này được lặp đi lặp lại
Ý tưởng cốt lõi cho việc mở rộng kỹ thuật thực thi biểu trưng mà nghiên cứu này đề xuất được chỉ ra trong Hình 2.7 dưới đây
Trang 13Hình 2.7 Đồ thị xâu
Tiếp theo, quá trình lặp được thực hiện với hai bước như sau:
- Bước 1: Bộ giải ràng buộc hiện thời của JPF được gọi để xử lý các ràng buộc kiểu nguyên, kiểu
thực, kiểu logic…và nếu nó giải được chuyển qua bước 2
- Bước 2: Các giá trị cụ thể thu được từ bước 1 được truyền tới cho đồ thị xâu và khi đó bộ giải ràng
buộc xâu được gọi để giải chúng Trong trường hợp này, “bộ giải ràng buộc xâu” có thể là AutomataSolve hay là BitVectorSolve và có thể ràng buộc của đồ thị xâu không thỏa mãn với các giá trị nhận được và nếu thời gian giới hạn còn thỏa mãn ta thực hiện quay lại bước 1 và ràng buộc xâu sẽ được thêm các ràng buộc mới
Hình 2.8 Thuật toán giải ràng buộc hỗn hợp
Giá trị giới hạn thời gian “timeout” được đưa vào để đảm bảo trong trường hợp sự kết hợp giữa hai
bộ giải ràng buộc kiểu xâu và ràng buộc kiểu nguyên vẫn không thể đưa ra được kết luận cuối cùng trong một thời gian cho phép Khi đó thuật toán vẫn dừng với kết luận ràng buộc trên là không thỏa mãn