Tổng quan nghiên cứu

Trong lĩnh vực phát triển phần mềm, gỡ lỗi là một công đoạn quan trọng nhưng tốn kém và chủ yếu thực hiện thủ công. Theo báo cáo của ngành, quá trình định vị lỗi chiếm phần lớn thời gian và công sức trong việc sửa lỗi phần mềm. Việc tự động hóa định vị lỗi giúp giảm đáng kể chi phí và tăng hiệu quả phát triển. Mục tiêu của luận văn là xây dựng một công cụ định vị lỗi tự động cho các ứng dụng C/C++ dựa trên kỹ thuật định vị lỗi dựa trên phổ (Spectrum-based Fault Localization - SFL). Nghiên cứu tập trung vào việc phát triển công cụ HiFa, tích hợp nhiều kỹ thuật SFL như Tarantula, Ochiai, Op2, Dstar, đồng thời đề xuất sử dụng phổ DHS (Data-dependence Hit Spectrum) bên cạnh phổ ESHS (Executable Statement Hit Spectrum) truyền thống nhằm nâng cao hiệu quả định vị lỗi. Phạm vi nghiên cứu bao gồm các chương trình C/C++ với dữ liệu thử nghiệm từ bộ Siemens, chương trình Grep, Sed và Space, trong khoảng thời gian đến năm 2022. Việc áp dụng công cụ HiFa có ý nghĩa lớn trong việc giảm thiểu thời gian gỡ lỗi, nâng cao chất lượng phần mềm và hỗ trợ lập trình viên tập trung vào các vị trí nghi ngờ lỗi chính xác hơn.

Cơ sở lý thuyết và phương pháp nghiên cứu

Khung lý thuyết áp dụng

Luận văn dựa trên các lý thuyết và mô hình sau:

  • Khái niệm lỗi phần mềm: Theo chuẩn IEEE, lỗi (fault) là sai sót trong mã nguồn, lỗi thực thi (error) là trạng thái sai khi chạy chương trình, và failure là kết quả sai lệch so với mong đợi. Định vị lỗi tập trung vào việc xác định vị trí gây failure trong mã nguồn.
  • Kiểm thử phần mềm: Bao gồm kiểm thử hộp đen (dựa trên đặc tả) và kiểm thử hộp trắng (dựa trên cấu trúc mã nguồn). Độ bao phủ kiểm thử (statement, branch, condition) là chỉ số quan trọng đánh giá hiệu quả bộ kiểm thử.
  • Kỹ thuật định vị lỗi dựa trên phổ (SFL): Thu thập thông tin thực thi chương trình qua các ca kiểm thử thành công và thất bại, tính toán độ nghi ngờ của từng câu lệnh dựa trên tần suất xuất hiện trong các ca kiểm thử thất bại so với thành công. Các chỉ số xếp hạng như Tarantula, Ochiai, Jaccard, Dstar được sử dụng để đánh giá mức độ nghi ngờ.
  • Phổ ESHS và DHS: Phổ ESHS ghi nhận câu lệnh được thực thi, phổ DHS ghi nhận các cặp def-use (định nghĩa-sử dụng biến) được thực thi, giúp đánh giá chính xác hơn mối quan hệ dữ liệu trong chương trình.
  • Framework LLVM: Được sử dụng để điều chỉnh mã nguồn (instrumentation) nhằm thu thập dữ liệu phổ trong quá trình thực thi.

Phương pháp nghiên cứu

  • Nguồn dữ liệu: Sử dụng bộ dữ liệu thử nghiệm gồm 10 chương trình với tổng cộng hàng trăm phiên bản lỗi, bao gồm bộ Siemens (7 chương trình), Grep, Sed và Space. Mỗi chương trình có số lượng dòng lệnh và ca kiểm thử đa dạng, từ vài trăm đến hơn 13 nghìn dòng lệnh và hàng nghìn ca kiểm thử.
  • Phương pháp phân tích:
    • Điều chỉnh mã nguồn bằng LLVM để thu thập phổ ESHS và DHS.
    • Thực thi chương trình với bộ kiểm thử, thu thập dữ liệu thực thi và kết quả ca kiểm thử (thành công/thất bại).
    • Tính toán độ nghi ngờ từng câu lệnh dựa trên các chỉ số xếp hạng SFL.
    • So sánh hiệu quả định vị lỗi giữa các loại phổ và kỹ thuật xếp hạng bằng chỉ số Expense (tỷ lệ phần trăm mã cần kiểm tra để tìm lỗi).
  • Timeline nghiên cứu: Nghiên cứu được thực hiện trong năm 2022, bao gồm giai đoạn thu thập dữ liệu, phát triển công cụ HiFa, thử nghiệm và đánh giá kết quả.

Kết quả nghiên cứu và thảo luận

Những phát hiện chính

  1. Hiệu quả của phổ DHS vượt trội so với phổ ESHS: Các phổ DHS, DHS-def và DHS-use cho thấy khả năng định vị lỗi tốt hơn phổ ESHS với hầu hết các chỉ số xếp hạng. Ví dụ, với kỹ thuật Barinel, phổ DHS-use xác định được 83% lỗi khi kiểm tra 30% mã chương trình, trong khi phổ ESHS cần kiểm tra tới 40% mã để đạt hiệu quả tương tự.
  2. Sự khác biệt giữa các kỹ thuật xếp hạng: Kỹ thuật Barinel và DRT có hiệu quả định vị lỗi cao nhất, trong khi Wong3 có hiệu quả thấp nhất trên phổ ESHS. Tuy nhiên, sự chênh lệch giữa các kỹ thuật trên các phổ khác nhau không quá 10% tổng số lỗi.
  3. Phổ DHS-use thể hiện hiệu quả nhất trong nhóm phổ DHS: Đường đồ thị điểm Expense của phổ DHS-use luôn nằm trên các đường điểm của DHS và DHS-def, cho thấy khả năng định vị lỗi tốt hơn, đặc biệt khi kiểm tra dưới 50% mã chương trình.
  4. Công cụ HiFa hoạt động hiệu quả trên các chương trình đa dạng: Thử nghiệm trên các chương trình có kích thước và số lượng ca kiểm thử khác nhau (từ 173 đến hơn 13 nghìn dòng lệnh, từ 370 đến hơn 13 nghìn ca kiểm thử) cho thấy công cụ có khả năng xử lý tốt và cung cấp bảng xếp hạng nghi ngờ chính xác.

Thảo luận kết quả

Nguyên nhân phổ DHS vượt trội là do nó ghi nhận mối quan hệ dữ liệu giữa các câu lệnh thông qua cặp def-use, giúp xác định chính xác hơn các vị trí gây lỗi liên quan đến biến và luồng dữ liệu. So với phổ ESHS chỉ ghi nhận câu lệnh được thực thi, phổ DHS cung cấp thông tin chi tiết hơn về luồng dữ liệu, từ đó nâng cao độ chính xác định vị lỗi.

Kết quả này phù hợp với các nghiên cứu trước đây về việc sử dụng thông tin luồng dữ liệu trong gỡ lỗi tự động. Việc tích hợp phổ DHS vào công cụ HiFa giúp cải thiện đáng kể hiệu quả định vị lỗi, giảm số lượng mã cần kiểm tra, từ đó tiết kiệm thời gian và công sức cho lập trình viên.

Biểu đồ điểm Expense minh họa rõ ràng sự khác biệt hiệu quả giữa các loại phổ và kỹ thuật xếp hạng, giúp người dùng công cụ dễ dàng lựa chọn phương pháp phù hợp với yêu cầu thực tế. Giao diện đồ họa của HiFa hỗ trợ trực quan việc quan sát mức độ nghi ngờ của từng câu lệnh, tăng tính tiện dụng và khả năng áp dụng trong thực tế.

Đề xuất và khuyến nghị

  1. Áp dụng phổ DHS trong các công cụ định vị lỗi cho C/C++: Khuyến nghị các nhà phát triển công cụ gỡ lỗi tích hợp phổ DHS và các biến thể DHS-def, DHS-use để nâng cao hiệu quả định vị lỗi, đặc biệt trong các dự án phần mềm lớn và phức tạp.
  2. Phát triển thêm các chỉ số xếp hạng phù hợp với phổ DHS: Nghiên cứu và phát triển các công thức tính độ nghi ngờ mới tận dụng tối đa thông tin từ phổ DHS nhằm cải thiện độ chính xác và giảm thiểu số lượng mã cần kiểm tra.
  3. Tích hợp công cụ HiFa vào quy trình phát triển phần mềm: Đề xuất sử dụng HiFa trong các giai đoạn kiểm thử và bảo trì phần mềm để hỗ trợ lập trình viên nhanh chóng xác định vị trí lỗi, giảm thời gian gỡ lỗi.
  4. Mở rộng thử nghiệm trên các ngôn ngữ và môi trường khác: Khuyến khích nghiên cứu mở rộng công cụ và kỹ thuật sang các ngôn ngữ lập trình khác và môi trường phát triển đa nền tảng nhằm tăng tính ứng dụng rộng rãi.
  5. Đào tạo và hướng dẫn sử dụng công cụ cho lập trình viên: Tổ chức các khóa đào tạo, tài liệu hướng dẫn chi tiết để giúp lập trình viên tận dụng tối đa các tính năng của công cụ HiFa, nâng cao hiệu quả công việc.

Đối tượng nên tham khảo luận văn

  1. Lập trình viên và kỹ sư phần mềm: Nhóm này sẽ được hỗ trợ trong việc giảm thời gian gỡ lỗi, tập trung kiểm tra các vị trí nghi ngờ lỗi chính xác, nâng cao hiệu quả phát triển và bảo trì phần mềm.
  2. Nhà nghiên cứu và phát triển công cụ kiểm thử phần mềm: Luận văn cung cấp cơ sở lý thuyết và phương pháp thực nghiệm để phát triển các công cụ định vị lỗi tự động, đặc biệt trong môi trường C/C++.
  3. Giảng viên và sinh viên ngành kỹ thuật phần mềm: Tài liệu này là nguồn tham khảo quý giá về các kỹ thuật định vị lỗi hiện đại, phương pháp thu thập và xử lý dữ liệu phổ, cũng như ứng dụng LLVM trong điều chỉnh mã nguồn.
  4. Các tổ chức phát triển phần mềm quy mô lớn: Các doanh nghiệp có quy trình phát triển phần mềm phức tạp có thể áp dụng công cụ và kỹ thuật trong luận văn để nâng cao chất lượng sản phẩm và giảm chi phí bảo trì.

Câu hỏi thường gặp

  1. Công cụ HiFa có thể áp dụng cho ngôn ngữ lập trình nào ngoài C/C++ không?
    HiFa được thiết kế và thử nghiệm chủ yếu cho các ứng dụng C/C++ do sử dụng LLVM framework. Tuy nhiên, với sự hỗ trợ của LLVM cho nhiều ngôn ngữ, công cụ có thể được mở rộng cho các ngôn ngữ khác trong tương lai.

  2. Phổ DHS khác gì so với phổ ESHS trong định vị lỗi?
    Phổ DHS ghi nhận các cặp def-use (định nghĩa-sử dụng biến) được thực thi, cung cấp thông tin về luồng dữ liệu trong chương trình, giúp xác định lỗi chính xác hơn so với phổ ESHS chỉ ghi nhận câu lệnh được thực thi.

  3. Chỉ số Expense được tính như thế nào và ý nghĩa ra sao?
    Expense là tỷ lệ phần trăm mã nguồn mà lập trình viên phải kiểm tra để tìm ra lỗi đầu tiên. Chỉ số này càng thấp càng tốt, thể hiện hiệu quả định vị lỗi cao, giúp giảm công sức kiểm tra.

  4. Hiệu quả của các kỹ thuật xếp hạng độ nghi ngờ có sự khác biệt lớn không?
    Các kỹ thuật như Barinel, DRT thường cho hiệu quả cao hơn Wong3, đặc biệt trên phổ ESHS. Tuy nhiên, sự khác biệt tổng thể không quá 10% trên các bộ dữ liệu thử nghiệm.

  5. Công cụ HiFa có giao diện người dùng trực quan không?
    HiFa cung cấp giao diện đồ họa cho phép lập trình viên xem mã nguồn cùng mức độ nghi ngờ của từng câu lệnh qua dải màu từ xanh (thấp) đến đỏ (cao), giúp dễ dàng xác định vị trí lỗi.

Kết luận

  • Luận văn đã xây dựng thành công công cụ định vị lỗi HiFa cho ứng dụng C/C++ dựa trên kỹ thuật định vị lỗi dựa trên phổ, tích hợp phổ ESHS và phổ DHS.
  • Phổ DHS và các biến thể DHS-def, DHS-use cho hiệu quả định vị lỗi vượt trội so với phổ ESHS truyền thống.
  • Công cụ HiFa được thử nghiệm trên nhiều chương trình với kích thước và số lượng ca kiểm thử đa dạng, cho kết quả đánh giá tích cực về hiệu quả và tính ứng dụng.
  • Các kỹ thuật xếp hạng độ nghi ngờ như Barinel, DRT thể hiện hiệu quả cao nhất trong việc định vị lỗi.
  • Đề xuất mở rộng nghiên cứu và ứng dụng công cụ trong thực tế, đồng thời phát triển thêm các kỹ thuật và chỉ số mới để nâng cao hiệu quả định vị lỗi.

Hành động tiếp theo là triển khai công cụ HiFa vào quy trình phát triển phần mềm thực tế, đồng thời nghiên cứu mở rộng sang các ngôn ngữ và môi trường khác nhằm nâng cao tính ứng dụng và hiệu quả của công cụ.