Bạn có thể giới thiệu các bài kiểm tra đơn vị về các chức năng liên quan, chỉ tồn tại để đóng gcov bằng cách trực tiếp tấn công các đường dẫn mã không theo luật không? Vì họ là những bài kiểm tra đơn vị, có lẽ họ có thể bỏ qua "điều không thể" của các tình huống. Họ có thể gọi các hàm không bao giờ được gọi, chuyển các giá trị enum không hợp lệ để bắt các nhánh mặc định, v.v.
Sau đó, chạy các kiểm tra đó chỉ trên phiên bản mã của bạn được biên dịch bằng NDEBUG hoặc chạy chúng trong khai thác thử nghiệm rằng khẳng định được kích hoạt - bất kể khung kiểm thử của bạn hỗ trợ.
Tôi thấy nó hơi kỳ quặc mặc dù thông số kỹ thuật cho biết mã phải ở đó, thay vì thông số chứa các yêu cầu chức năng trên mã. Đặc biệt, điều đó có nghĩa là các thử nghiệm của bạn không thử nghiệm các yêu cầu đó, đó là một lý do tốt để giữ các yêu cầu chức năng. Cá nhân tôi muốn sửa đổi các spec để nói, "nếu được gọi với một giá trị enum không hợp lệ, chức năng sẽ thất bại một assert
. Người gọi sẽ không gọi hàm với một giá trị enum không hợp lệ trong chế độ phát hành". Hoặc một số như vậy.
Có lẽ những gì nó hiện đang nói, nằm dọc theo dòng "tất cả các câu lệnh chuyển đổi phải có trường hợp mặc định". Nhưng điều đó có nghĩa là các tiêu chuẩn mã hóa đang can thiệp vào hành vi quan sát (ít nhất, có thể quan sát được dưới gcov) bằng cách giới thiệu mã chết. Tiêu chuẩn mã hóa không nên thực hiện điều đó, vì vậy đặc tả chức năng cần tính đến các tiêu chuẩn mã hóa nếu có thể.
Nếu không, bạn có thể quấn mã không thể chuyển được trong #if !GCOV_BUILD
và tạo một bản dựng riêng cho lợi ích của gcov. Xây dựng này sẽ thất bại một số yêu cầu, nhưng có điều kiện phân tích mã của bạn là chính xác, nó mang lại cho bạn sự tự tin mà bạn muốn rằng bộ kiểm thử kiểm tra mọi thứ khác.
Chỉnh sửa: bạn nói rằng bạn đang sử dụng trình tạo mã dodgy, nhưng bạn cũng đang yêu cầu giải pháp bằng cách chú thích mã nguồn. Nếu bạn đang thay đổi nguồn, bạn có thể loại bỏ mã chết trong nhiều trường hợp không? Không phải việc thay đổi nguồn được tạo là lý tưởng, nhưng cần phải ...
Nguồn
2010-08-24 13:23:53
Điều gì làm cho bạn như vậy chắc chắn rằng dòng là unhittable? Nếu đó là bởi vì bạn đã không thể đánh chúng, tốt đó là những gì bạn đang cố gắng tìm ra với bảo hiểm mã. – doron
@ deus-ex-machina399: Không, không phải vì tôi không thể đánh chúng. Đó là do sự hiểu biết và phân tích mã. Tất nhiên, tôi có thể sai, nhưng tôi không sử dụng phân tích phạm vi mã để cố gắng xác minh sự hiểu biết của tôi về mã nguồn. Tôi đang sử dụng phân tích phạm vi mã để xác minh chất lượng của bộ thử nghiệm của mình. – jchl
@ doron, một ví dụ về mã nên không thể chuyển được là đường dẫn lỗi trong cơ sở hạ tầng thử nghiệm của bạn. Tất nhiên, bạn có thể có thể làm mà không có con đường như vậy, nhưng tôi có chúng. –