gpt4 book ai didi

c++ - 代码覆盖警告垃圾邮件输出

转载 作者:行者123 更新时间:2023-12-02 10:25:03 26 4
gpt4 key购买 nike

在CMake测试配置中,我添加了标记以生成代码覆盖率

IF( "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR
"${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0 -fprofile-arcs -ftest-coverage")
SET(CMAKE_C_FLAGS "-g -O0 -fprofile-arcs -ftest-coverage ")
endif()

每次我运行测试时,我的输出都会被这些消息所干扰:

profiling: /xxxx/xxxxxj/projects/build-xxxxx-CLang-Debug/tests/CMakeFiles/xxxxxxxxxxxxxt_ut.dir/tests/gui/ship_design/ut_ship_stats_header.cpp.gcda: cannot merge previous GCDA file: mismatched number of counters (14)

profiling: /xxxx/xxxxxx/projects/build-xxxxxxxxxxxxxxx-CLang-Debug/tests/CMakeFiles/xxxxxxxxxxxxxxx_ut.dir/tests/gui/ship_design/ut_ship_stats_header.cpp.gcda: cannot merge previous GCDA file: corrupt arc tag (0x2b8e100f)

profiling: /xxxx/xxxxxx/projects/build-xxxxxxxxxxxxxxx-CLang-Debug/tests/CMakeFiles/xxxxxxxxxxxxxxx_ut.dir/tests/ut_generate_hex_path.cpp.gcda: cannot merge previous GCDA file: corrupt arc tag (0x65646f6e)



我不必说这至少会使阅读测试结果变得困难。当我删除以前生成的所有gcda文件时,上述问题消失了。因此,有两种可能的解决方案。
  • 我可能会错过一些有值(value)的代码覆盖率数据配置(即,调用lcov --zerocounters

  • FIND_PROGRAM( LCOV_PATH lcov )

    COMMAND ${LCOV_PATH} -z --directory ${PROJECT_BINARY_DIR}}


  • 我需要添加自定义目标,以在提交测试运行之前删除所有gcda文件。

  • 我应该如何解决这个问题?

    最佳答案

    我认为您可能在工作流程中做了一些不寻常的事情,因为您看到的问题并非总是会发生。但是,我在这里添加的内容应该可以帮助您弄清楚或完全解决它。

    首先,您应该利用CMake的build-types并创建自己的“覆盖类型”。

    ## coverage flags
    set(CMAKE_CXX_FLAGS_COVERAGE "-g -O0 -fprofile-arcs -ftest-coverage" CACHE STRING "Flags used by the C++ compiler during coverage builds.")
    set(CMAKE_C_FLAGS_COVERAGE "-g -O0 -fprofile-arcs -ftest-coverage" CACHE STRING "Flags used by the C compiler during coverage builds.")
    set(CMAKE_EXE_LINKER_FLAGS_COVERAGE "-g -O0 -fprofile-arcs -ftest-coverage" CACHE STRING "Flags used for linking binaries during coverage builds.")
    set(CMAKE_SHARED_LINKER_FLAGS_COVERAGE "-g -O0 -fprofile-arcs -ftest-coverage" CACHE STRING "Flags used by the shared libraries linker during coverage builds.")

    mark_as_advanced(
    CMAKE_CXX_FLAGS_COVERAGE
    CMAKE_C_FLAGS_COVERAGE
    CMAKE_EXE_LINKER_FLAGS_COVERAGE
    CMAKE_SHARED_LINKER_FLAGS_COVERAGE)

    ## Update the documentation string of CMAKE_BUILD_TYPE for GUIs
    set(CMAKE_BUILD_TYPE "${CMAKE_BUILD_TYPE}" CACHE STRING "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel RelWithAssert Coverage." FORCE)

    然后创建一个 custom target
    ## create our "make coverage" target
    add_custom_target(coverage
    COMMAND if test ! -d ../output \; then mkdir ../output\; fi
    COMMAND find ${CMAKE_BINARY_DIR} -name \*.gcda -delete
    COMMAND lcov -b CMakeFiles/ -d . -z
    COMMAND lcov -b -d . -c -i -o test_base.info
    COMMAND ./env-shell.sh ctest -j2 || true
    COMMAND lcov -b CMakeFiles/ -d . -c -o test_run.info
    COMMAND lcov -b CMakeFiles/ -d . -a test_base.info -a test_run.info -o test_total.info
    COMMAND lcov -o reports.info -r test_total.info '/usr/include/*' '/usr/local/*' '/cvmfs/*' '*/numpy' '/usr/lib/gcc/*' ${p} '${CMAKE_BINARY_DIR}/CMakeFiles/' '${CMAKE_BINARY_DIR}/steamshovel/*'
    COMMAND genhtml --ignore-errors source --legend -o ../output/`date +%Y-%m-%d` reports.info
    )

    现在,利用无源构建,在与源并行的“coverage”目录中运行 cmake
    $ pwd
    /home/user/my_project/src
    $ mkdir ../coverage
    $ cd ../coverage
    $ cmake -DCMAKE_BUILD_TYPE=Coverage ../src
    [ ... cmake's output here ...]
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /home/user/my_project/coverage

    $

    现在,构建您的项目和测试,并运行“覆盖率”目标。
    $ make
    $ make test-bins
    $ make coverage
    [ ... make's output here ... ]
    $

    我们在CMakeLists.txt中定义的 make coverage目标将:
  • (如果不存在),创建一个与我们的源代码平行的“输出”目录并构建目录
  • 查找并删除当前构建目录
  • 中的所有 *.gcda文件
  • 为零,并初始化我们的lcov计数器和输出文件
  • 通过ctest运行我们的测试
  • “编译” lcov输出并生成我们的HTML覆盖率报告

  • 请注意,您可能需要针对特定​​项目进行调整。

    在这一点上,我强烈建议将所有这些自动化。将它添加到您的持续集成中(如果有的话),或者甚至设置一个 cron作业,这样它可以在一夜之间运行,并且您可以重新开始一份新的覆盖率报告。 (这些示例来自一个正在执行的项目,该项目执行 buildbot处理的夜间覆盖率报告。)

    关于c++ - 代码覆盖警告垃圾邮件输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41936659/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com