首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GCOV/LCOV忽略“未使用函数”之前声明的“已使用函数”

GCOV/LCOV忽略“未使用函数”之前声明的“已使用函数”
EN

Stack Overflow用户
提问于 2022-04-26 05:39:27
回答 1查看 177关注 0票数 2

这个问题可能看起来很奇怪。

我尝试在我的小项目中使用GCOV/LCOV,并在应用之前使用简单的代码。在实践中,我遇到了一个错误,我不知道如何解决。

LCOV创建的报告显示,在源代码文件中未使用的函数之前声明的函数被报告为未使用的函数。相反,函数在执行二进制文件时显示正确的输出。

以下是实践中使用的实际代码。

代码语言:javascript
复制
# 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
代码语言:javascript
复制
// 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);
代码语言:javascript
复制
// 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;
}
代码语言:javascript
复制
// 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-循环之外时,报表将返回。

代码语言:javascript
复制
Overall coverage rate:
  lines......: 96.7% (29 of 30 lines)
  functions..: 100.0% (7 of 7 functions)

结果是预期的。

func_not_reachable()被删除时,预期结果是

代码语言:javascript
复制
Overall coverage rate:
  lines......: 86.5% (25 of 29 lines)
  functions..: 100.0% (6 of 7 functions)

因为func_not_reachable()是不会被执行的。

然而,实际结果是

代码语言:javascript
复制
Overall coverage rate:
  lines......: 65.5% (19 of 29 lines)
  functions..: 57.1% (4 of 7 functions)

如果dummy_class.cpp被修改如下

代码语言:javascript
复制
#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;
}

报告结果如下。

代码语言:javascript
复制
Overall coverage rate:
  lines......: 34.5% (10 of 29 lines)
  functions..: 14.3% (1 of 7 functions)

我确信我在使用GCOV和LCOV时犯了错误,但我不知道我在哪里犯了错误。有人能告诉我我在哪里犯的错误吗?

上面的代码是在以下情况下执行的。

  • Ubuntu 20.04.4 LTS
  • g++ (Ubuntu11.1.0-1 ubuntu1~20.04) 11.1.0
  • gcov (Ubuntu9.3.0-17 ubuntu1~20.04) 9.3.0
  • LCOV : LCOV版本1.14

F 226

EN

回答 1

Stack Overflow用户

发布于 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。

测试条件如下

  • Ubuntu 22.04.4 LTS
  • g++ (Ubuntu11.2.0-19 ubuntu1) 11.2.0
  • gcov (Ubuntu11.2.0-19 ubuntu1) 11.2.0

更新完成后,代码覆盖率将使用g++报告正确的结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72008880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档