Không có cách nào để chắc chắn tuyệt đối các loại hành vi không xác định (trong điều kiện chủng tộc cụ thể) không tồn tại.
Tuy nhiên, có một số công cụ hiển thị một số lượng tốt các tình huống như vậy. Bạn có thể chứng minh rằng hiện tại có một vấn đề với các công cụ như vậy, mặc dù bạn không thể chứng minh rằng sửa chữa của mình là hợp lệ.
Một số công cụ thú vị cho mục đích này:
Valgrind là một công cụ kiểm tra bộ nhớ. Nó tìm thấy rò rỉ bộ nhớ, đọc bộ nhớ chưa được khởi tạo, sử dụng các con trỏ lơ lửng và truy cập ngoài giới hạn.
Helgrind là một công cụ kiểm tra an toàn chủ đề. Nó tìm thấy điều kiện chủng tộc.
Cả hai đều hoạt động bằng thiết bị động, tức là chúng đưa chương trình của bạn nguyên trạng và thực thi nó trong môi trường ảo hóa. Điều này làm cho chúng không cố ý, nhưng chậm.
UBSan là một trình kiểm tra hành vi không xác định. Nó tìm thấy các trường hợp khác nhau của hành vi không xác định C và C ++, chẳng hạn như tràn số nguyên, dịch chuyển ngoài phạm vi và các công cụ tương tự.
MSan là một công cụ kiểm tra bộ nhớ. Nó có mục tiêu tương tự như Valgrind.
TSan là một kiểm tra an toàn chủ đề. Nó có mục tiêu tương tự như Helgrind.
Ba cái này được tích hợp vào trình biên dịch Clang và tạo mã tại thời điểm biên dịch. Điều này có nghĩa là bạn cần tích hợp chúng vào quá trình xây dựng của mình (cụ thể là bạn phải biên dịch với Clang), điều này khiến chúng khó thiết lập ban đầu hơn * xay, nhưng mặt khác chúng có chi phí thời gian chạy thấp hơn nhiều.
Tất cả các công cụ tôi liệt kê đều hoạt động trên Linux và một số trong số chúng trên MacOS. Tôi không nghĩ rằng bất kỳ công việc nào trên Windows đáng tin cậy.