Kiểm tra xem KLEE có phát hiện được lỗi hàm là do đột ngột gọi abort()
không. Hàm abort() trong ngôn ngữ C thuộc thư viện process.h. Khi hàm
abort() ở dòng 9 được gọi thì tất cả các công việc đang được xử lý sẽ bị hủy bỏ toàn bộ và kết thúc chương trình một cách vô điều kiện. Ở đoạn mã chương trình hình 4.3.3.a nếu nếu xâu vào là “bye!” thì câu lệnh return 0 ở dòng 11 sẽ không bao giờ được thực hiện. Do đó chương trình sẽ phát sinh lỗi.
Hình 4.3.3.a Đoạn mã nguồn có gọi hàm abort()
1. #include <string.h> 2. #include <stdlib.h>
3. int main (int argc, char * argv[]){ 5. char myStr[5];
6. int a ; // biến chứa kết quả trả về của hàm strcmp() 7. a = strcmp(myStr, "bye!")
8. klee_make_symbolic(&myStr, sizeof(myStr), "myStr"); 9. if(a== 0){
10. abort();} 11. return 0;}
{( i < 4), (0 < i < 4) , assert(a[i]= null) } SAT Test 1 UNSAT Test 2 UNSAT Test 2 1
{(i < 4), (0 < i < 4), assert(a[i]= null) } 2
{( i < 4), assert(a[i]= null) } 3
STP Z3
Boolector
Bước 1: Thực thi tượng trưng được hiện bởi cây thực thi ở hình 4.3.3.b.
Hình 4.3.3.b. Cây thực thi tượng trưng phát hiện lỗi hàm abort()
Tại bước này quá trình thực thi tượng trưng với KLEE thực hiện duyệt nhánh PC2 sau khi gặp câu lệnh return và kết thúc. Nhưng nhánh PC1 hàm abort() được gọi hàm này hủy toàn bộ các thao tác đã làm trước đó. Vì vậy, quá trình thực thi tượng trưng không thể kết thúc do chưa gặp câu lệnh return hoặc gặp lỗi.
Bước 3: Sau thời gian chờ (time out) mặc định là 2 phút, KLEE sinh được 3 ca kiểm thử sau:
Ca kiểm thử 1: Xâu vào rỗng gồm 4 kí tự kết thúc xâu "\0\0\0\0"
Ca kiểm thử 2: Xâu vào là xâu " bye!\0"
Ca kiểm thử 3: Xâu vào là kí tự a và 3 kí tự kết thúc xâu "a\0\0\0"
Bước 3: Độ bao phủ mã nguồn trong trường hợp này là nhỏ hơn 100%.