Thực thi ký hiệu cho phép phân tích các chương trình với các đầu vào không được khởi tạo. Ý tưởng chính là để sử dụng các giá trị ký hiệu thay vì dữ liệu thực, như các giá trị đầu vào và để biểu diễn các giá trị của các biến chương trình như là các biểu thức ký hiệu. Kết quả là, các đầu ra được tính toán bởi một chương trình được biểu thị như là một hàm của các đầu vào ký hiệu.
JPF có một số phần mở rộng. Một trong những phần mở rộng được thiết kế để thực thi ký hiệu của các chương trình Java. Một trong các ứng dụng chính để tạo ra các đầu vào một cách tự động để thu được độ phủ cao (ví dụ: path coverage) của mã. Các ứng dụng khác bao gồm sự dò lỗi trong các ứng dụng tương tranh mà các đầu vào từ các miền không giới hạn và việc chứng minh định lý ít quan trọng.
Hình 4.1. Thực thi ký hiệu
Sự mở rộng kết hợp thực thi ký hiệu với kiểm chứng mô hình (model checking) và xử lý ràng buộc đối với việc tạo ra các đầu vào kiểm thử. Trong công cụ này, các chương trình được thực thi trên các đầu vào ký hiệu bao phủ tất cả các khả năng đầu vào cụ thể. Các giá trị của các biến được biểu diễn như là các biểu thức số học và các ràng buộc, được tạo ra từ sự phân tích cấu trúc mã. Các ràng buộc này sau đó được giải để tạo ra các đầu vào kiểm thử được đảm bảo để đạt được phần mã đó.
Trong hình 4.1 điều kiện dẫn (Path Condition – PC) được khởi tạo là true. Nếu chương trình chọn nhánh true (then) của câu lệnh if thì điều kiện dẫn sẽ là X<Y. Nếu chương trình chọn nhánh false (else) của câu lệnh if thì điều kiện dẫn sẽ là X≥Y.
Cho đến thời điểm hiện tại, thực thi ký hiệu làm việc tốt nhất đối với các phương thức có các tham số nguyên. Việc thực thi ký hiệu đối với các tham số kiểu double hay float đang ở mức hạn chế, nó chỉ thực hiện được trong một số trường hợp.
Thực thi ký hiệu được thực hiện bởi việc thông dịch “không theo chuẩn” các mã byte-code. Thông tin ký hiệu được sản sinh bởi các thuộc tính được liên kết với các biến, toán hạng, … Sự cài đặt hiện tại mới chỉ sử dụng cho các ràng buộc tuyến tính với các toán tử cộng (+), trừ (-), nhân (*) và các toán tử lôgic. Các toán tử khác như chia, lũy thừa, … chưa được hỗ trợ. Thực thi ký hiệu có thể bắt đầu từ bất kỳ điểm nào trong chương trình và nó có thể chạy với sự thực thi cụ thể và ký hiệu được pha trộn. Việc so khớp trạng thái (state matching) được tắt trong quá trình thực thi ký hiệu.
Để thực thi ký hiệu một phương thức, người dùng cần xác định tham số nào của phương thức là ký hiệu hay cụ thể. JPF sẽ xác định phương thức cần thực thi ký hiệu và kiểu của các tham số của phương thức là ký hiệu hay cụ thể dựa trên một cấu hình. Ví dụ sau cho phép thực thi ký hiệu phương thức có tên là withdrawMoney() mà tham số đầu tiên là ký hiệu (symbolic) và tham số thứ hai là cụ thể (concrete), lớp chứa hàm
main và triệu gọi phương thức withdrawMoney() có tên là Test thì các tham số được thiết lập cho JPF để thực thi ký hiệu trong Eclipse như sau:
+vm.insn_factory.class=gov.nasa.jpf.symbc.SymbolicInstructionFactory +jpf.listener=gov.nasa.jpf.symbc.SymbolicListener +symbolic.method=withdrawMoney(sym#con) +search.multiple_errors=true +jpf.report.console.finished= Test