这个问题可能看起来很奇怪。
我尝试在我的小项目中使用GCOV/LCOV,并在应用之前使用简单的代码。在实践中,我遇到了一个错误,我不知道如何解决。
LCOV创建的报告显示,在源代码文件中未使用的函数之前声明的函数被报告为未使用的函数。相反,函数在执行二进制文件时显示正确的输出。
以下是实践中使用的实际代码。
# makefile
CC = g++
CFLAG = -g -fPIC -fprofile-arcs -ftest-coverage
RM = rm -rf
main.o : main.cpp
$(CC) $(CFLAG) -c -Wall -Werror main.cpp
dummy_class.o : dummy_class.cpp
$(CC) $(CFLAG) -c -Wall -Werror dummy_class.cpp
build : main.o dummy_class.o
$(CC) $(CFLAG) -o main main.o dummy_class.o
gcov: main.cpp dummy_class.cpp
gcov main.cpp dummy_class.cpp
coverage.info: gcov
lcov --capture --directory . --output-file coverage.info
lcov -remove coverage.info "/usr/include/*" "/usr/local/include/*" --output-file coverage.info
report : coverage.info
genhtml coverage.info --output-directory ./out
clean :
rm -f main
rm -f *.o *.so *.gcno *.gcda *.gcov coverage.info
rm -r out
do :
make build
./main
make report// dummy_class.hpp
#pragma once
void func_even_case(void);
void func_odd_case(void);
void func_not_reachable(void);
void dummy(void);
void dummy2(void);
void dummy3(void);// dummy_class.cpp
#include <iostream>
#include <vector>
#include "dummy_class.hpp"
void func_even_case(void)
{
std::cout << "This is even case" << std::endl;
}
void func_odd_case(void)
{
std::cout << "This is odd case" << std::endl;
}
void func_not_reachable(void)
{
std::cout << "This is not reachable" << std::endl;
}
void dummy(void)
{
std::cout << "This is dummy1." << std::endl;
}
void dummy2(void)
{
std::cout << "This is dummy2." << std::endl;
}
void dummy3(void)
{
std::cout << "This is dummy3." << std::endl;
}// main.cpp
#include <iostream>
#include "dummy_class.hpp"
int main(void)
{
for (int i = 0; i < 10; ++i)
{
if (i % 2 == 0)
{
func_even_case();
}
else if (i % 2 != 0)
{
func_odd_case();
}
else
{
func_not_reachable();
}
}
func_not_reachable();
dummy();
dummy2();
dummy3();
return 0;
}当func_not_reachable()放在for-循环之外时,报表将返回。
Overall coverage rate:
lines......: 96.7% (29 of 30 lines)
functions..: 100.0% (7 of 7 functions)结果是预期的。
当func_not_reachable()被删除时,预期结果是
Overall coverage rate:
lines......: 86.5% (25 of 29 lines)
functions..: 100.0% (6 of 7 functions)因为func_not_reachable()是不会被执行的。
然而,实际结果是
Overall coverage rate:
lines......: 65.5% (19 of 29 lines)
functions..: 57.1% (4 of 7 functions)如果dummy_class.cpp被修改如下
#include <iostream>
#include <vector>
#include "dummy_class.hpp"
void func_even_case(void)
{
std::cout << "This is even case" << std::endl;
}
void func_odd_case(void)
{
std::cout << "This is odd case" << std::endl;
}
void dummy(void)
{
std::cout << "This is dummy1." << std::endl;
}
void dummy2(void)
{
std::cout << "This is dummy2." << std::endl;
}
void dummy3(void)
{
std::cout << "This is dummy3." << std::endl;
}
// unused function declared at the end of the source code.
void func_not_reachable(void)
{
std::cout << "This is not reachable" << std::endl;
}报告结果如下。
Overall coverage rate:
lines......: 34.5% (10 of 29 lines)
functions..: 14.3% (1 of 7 functions)我确信我在使用GCOV和LCOV时犯了错误,但我不知道我在哪里犯了错误。有人能告诉我我在哪里犯的错误吗?
上面的代码是在以下情况下执行的。
F 226
发布于 2022-04-27 00:32:34
找出问题的根源。
这个问题与我使用的编译器(g++ 11.1.0)或gcov (9.3.0)有关。
当编译器从g++更改为clang时,代码覆盖率报告了正确的结果。
为了确保问题与编译器的特定版本(g++ 11.1.0)有关,我将系统从Ubuntu20.04.4LTS升级到Ubuntu22.04.4LTS。
测试条件如下
更新完成后,代码覆盖率将使用g++报告正确的结果。
https://stackoverflow.com/questions/72008880
复制相似问题