cuốn sách gpt4 ai đã làm

c++ - vấn đề lcov: hàm tạo trùng lặp kỳ lạ được đánh dấu là không được bao phủ & hàm không được đánh dấu là bị bao phủ, ngay cả khi các dòng của nó đã được thực thi

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-03 00:35:53 26 4
mua khóa gpt4 Nike

Trong nỗ lực tìm hiểu thêm về kiểm thử tự động bằng cách thiết lập và chạy một dự án thử nghiệm C++ nhỏ với phạm vi bao phủ 100%, tôi đã gặp phải vấn đề sau - mặc dù tất cả các dòng mã thực tế của tôi và tất cả các nhánh thực thi đều được kiểm thử , lcov vẫn báo cáo hai dòng là chưa được kiểm tra (chúng chỉ chứa các định nghĩa hàm) và một phương thức hàm tạo "trùng lặp" được cho là chưa được kiểm tra, mặc dù nó khớp hoàn hảo với hàm tạo "thực" của tôi (hàm duy nhất được xác định và sử dụng).

(bỏ qua để chỉnh sửa trường hợp sao chép tối thiểu)

Nếu tôi tạo số liệu thống kê mức độ phù hợp tương tự bằng cách sử dụng tập lệnh python gcovr (từ cùng một nguồn chính xác, tệp .gcno và .gcda) và chuyển kết quả đến plugin Jenkins Cobertura, nó mang lại cho tôi 100% - các hàng trên tất cả các số lượng, Điều kiện và phương pháp .

Ý tôi là:

Trang báo cáo của Jenkins Cobertura:http://gints.dyndns.info/heap_std_gcovr_jenkins_cobertura.html (Mọi thứ đều ở mức 100%).

Tệp .gcda tương tự được xử lý bằng lcov:http://gints.dyndns.info/heap_std_lcov.html (Hai dòng định nghĩa hàm được đánh dấu là chưa được thực thi, mặc dù các dòng trong các hàm này bị ghi đè hoàn toàn và hàm Hit = function Total - 1).

Thống kê hàm từ tệp nguồn của lcov: http://gints.dyndns.info/heap_std_lcov_func (hiển thị hai định nghĩa hàm tạo giống hệt nhau, cả hai đều tham chiếu cùng một dòng mã trong tệp, một định nghĩa được đánh dấu là nhấn 5 lần, còn lại là 0 lần).

Nếu tôi xem tệp lcov .info trung gian:http://gints.dyndns.info/lcov_coverage_filtered.info.txtTôi thấy cũng có hai định nghĩa hàm tạo ở đó, chúng phải nằm trên cùng một dòng: FN:8,_ZN4BBOS8Heap_stdC1Ev & FN:8,_ZN4BBOS8Heap_stdC2Ev.

Ồ, đừng bận tâm đến sự nhầm lẫn xung quanh .uic bao gồm/hàm hủy, đó chỉ là cách xử lý Nhánh trong hàm hủy được gcov báo cáo là gì? Một cách bẩn thỉu. Tôi vừa thử nó khi chụp những ảnh chụp nhanh tập tin đó.

Có ai có đề xuất về cách giải quyết vấn đề này? Trình biên dịch C++ có thực hiện một số phép thuật "đằng sau hậu trường" ở đây không? (Có lẽ tôi nên đảm bảo tạo thêm bản sao của các hàm tạo có mục đích đặc biệt được gọi từ các thử nghiệm của mình?) Còn các định nghĩa hàm thông thường thì sao - ngay cả khi phần thân đã được kiểm tra đầy đủ, làm sao dòng xác định có thể không được kiểm tra? Đây có phải chỉ là một vấn đề với lcov? Mọi đề xuất đều được chào đón - Tôi muốn biếtTại saoĐiều gì sẽ xảy ra nếu thử nghiệm của tôi thực sự có một số tính năng chưa được phát hiện và Cobertura không nhắc...hoặc nếu không, tôi phải thực hiện lcov như thế nào? Bạn hiểu không?

EDIT: Đã thêm kịch bản repro tối thiểu bên dưới

lcov_repro_one_bad.cpp:

#include 
lớp cha mẹ {
public:
Parent() ném() { }
khoảng trống ảo * Do_stuff(const unsigned m) Throw(std::runtime_error) =0;
};

lớp Con : cha mẹ công khai {
public:
Con() ném();
khoảng trống ảo * Do_stuff(const unsigned m)
Throw(std::runtime_error);
};

Con::Con()
ném()
: Cha mẹ()
{
}

void * Child::Do_stuff(const unsigned m)
ném(std::runtime_error)
{
const int a = m;
nếu ( a > 10 ) {
ném std::runtime_error("ôi!");
}
trả về NULL;
}

int main()
{
Con c;
c.Do_stuff(5);
thử {
c.Do_stuff(11);
}
bắt ( const std::runtime_error & ) { }
return 0;
}

Tạo tập tin:

GPP_FLAGS:=-fprofile-arcs -ftest-coverage -pedantic -pedantic-errors -W -Wall -Wextra -Werror -g -O0

tất cả:
g++ ${GPP_FLAGS} lcov_repro_one_bad.cpp -o lcov_repro_one_bad
./lcov_repro_one_bad
lcov --capture --directory ${PWD} --output-file lcov_coverage_all.info --base-directory ${PWD}
lcov --output-file lcov_coverage_filtered.info --extract lcov_coverage_all.info ${PWD}/*.*
genhtml --output-directory lcov_coverage_html lcov_coverage_filtered.info --demangle-cpp --sort --legend --highlight

Đây là báo cáo tôi nhận được từ nó:http://gints.dyndns.info/lcov_repro_bin/lcov_coverage_html/gints/lcov_repro/lcov_repro_one_bad.cpp.gcov.html

Như bạn có thể thấy, cái gọi là dòng sai là định nghĩa về ngoại lệ mà hàm có thể đưa ra và hàm tạo sai bổ sung cho Trẻ em vẫn hiện diện trong danh sách hàm (nhấp vào hàm ở trên cùng).

Tôi đã thử xóa câu lệnh ném khỏi định nghĩa hàm, câu lệnh này sẽ xử lý các dòng không được thực thi trong phần khai báo hàm:http://gints.dyndns.info/lcov_repro_bin/lcov_coverage_html/gints/lcov_repro/lcov_repro_one_v1.cpp.gcov.html (Hàm tạo bổ sung vẫn còn đó, như bạn có thể thấy).

Tôi đã thử di chuyển các định nghĩa hàm vào nội dung lớp thay vì định nghĩa chúng sau này, nhờ đó loại bỏ được hàm tạo bổ sung:http://gints.dyndns.info/lcov_repro_bin/lcov_coverage_html/gints/lcov_repro/lcov_repro_one_v2.cpp.gcov.html (Tuy nhiên, như bạn có thể thấy, định nghĩa hàm Do_stuff vẫn còn hơi lạ).

Sau đó, tất nhiên, nếu tôi làm cả hai điều trên thì mọi thứ đều ổn:http://gints.dyndns.info/lcov_repro_bin/lcov_coverage_html/gints/lcov_repro/lcov_repro_one_ok.cpp.gcov.html

Nhưng tôi vẫn bối rối về nguyên nhân cốt lõi của việc này... và tôi vẫn muốn các phương thức của mình (bao gồm cả hàm tạo) được xác định trong một tệp .cpp riêng biệt, không phải trong nội dung lớp và tôi muốn các hàm của mình hoạt động tốt -các ngoại lệ được xác định có thể được ném ra!

Đây là mã nguồn trong trường hợp bạn muốn chơi với mã này:http://gints.dyndns.info/lcov_repro_src.zip

Có ý tưởng gì không?

Cảm ơn!

câu trả lời hay nhất

Ok, sau khi nhìn xung quanh và đọc các khai báo ngoại lệ C++, tôi nghĩ tôi hiểu chuyện gì đang xảy ra:

  • Theo như câu lệnh ném bị bỏ sót, có vẻ như mọi thứ ở đây thực sự đúng: câu lệnh ném hàm nên thêm mã bổ sung vào tệp mục tiêu đầu ra để kiểm tra các ngoại lệ ném bất hợp pháp (trong trường hợp câu lệnh ném). Vì tôi không kiểm tra tình huống xảy ra điều này nên điều hợp lý là mã không bao giờ được thực thi và những câu lệnh này bị đánh dấu là sai. Mặc dù tình hình ở đây không hề lý tưởng chút nào, nhưng ít nhất có thể biết được điều này đến từ đâu.

  • Đây dường như là một vấn đề đã được thảo luận từ lâu với gcc khi có liên quan đến các hàm tạo trùng lặp (và các bản vá khác nhau cố gắng giải quyết việc sao chép mã mục tiêu dẫn đến):http://gcc.gnu.org/bugzilla/show_bug.cgi?id=3187 - Về cơ bản, hai phiên bản của hàm tạo được tạo - một cho lớp này và một cho các lớp con, và nếu muốn bao phủ 100%, bạn cần thực hành cả hai.

Về câu hỏi c++ - lcov: hàm tạo trùng lặp kỳ lạ được đánh dấu là không được bao phủ & hàm không được đánh dấu là được bao phủ, mặc dù các dòng của nó đã được thực thi, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/12807512/

26 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress