为什么需要为GCC中的代码覆盖传递两个编译器标志

我了解两个编译器标志: -ftest-coverage -fprofile-arcs需要传递给GCC中的代码覆盖。 我的问题是,有2个编译器标志获得覆盖的原因是什么? 另外,如果我们独立使用它们,我们会得到什么?

我试着用-fprofile-arcs标志编译ac程序。 我没有注意到任何差异。 能够生成.gcno .gcda和gcov文件


如果您查看-fprofile-arcs的文档,您将看到它生成的数据可以用于两种不同的事情,具体取决于其他选项: -ftest-coverage-fbranch-probabilities

所以-fprofile-arcs是生成检测和保存数据的代码。 然后,您可以使用-ftest-coverage-fbranch-probabilities来根据您要执行的分析对数据进行专门化。

它没有说任何地方,但从你的经验看,如果没有提供专门化标志,GCC似乎默认为-ftest-coverage


如果您想使用Gcov工具获取GCC中的代码覆盖范围,请参阅本文档,其中明确指出:

使用gcov时,您必须首先使用两个特殊的GCC选项编译您的程序:'-fprofile-arcs -ftest-coverage'。 这告诉编译器生成gcov所需的附加信息(基本上是程序的流程图),还包含用于生成gcov所需的额外分析信息的目标文件中的附加代码。

更确切地说,通过参考Instrumentation Options,我对这两个标志的理解如下:

  • -fprofile-arcs生成指示您的程序的每个分支被占用多少次的信息; 换句话说,这会使您的程序生成相对于其执行的额外数据。 信息存储在.gcda文件中。
  • -ftest-coverage使用-fprofile-arcs生成的信息,并生成包含控制流信息的.gcno文件,Gcov可以使用这些文件生成可读取的.gcov文件。 如果没有使用-fprofile-arcs获得的测试覆盖率数据,您将无法获得任何有意义的结果。
  • -fprofile-arcs还可以与其他标志相结合,例如-fbranch-probabilities (这里有更多信息)。 通常,在使用此标志时,编译器将根据.gcda文件中包含的分析信息执行优化以改善分支预测。 使用-fprofile-generate-fprofile-use (这是使用GCC执行配置文件引导优化的标准方式)时,会自动启用-fprofile-arcs-fbranch-probabilities

    希望这可以帮助!

    链接地址: http://www.djcxy.com/p/37971.html

    上一篇: Why two compiler flags needs to be passed for code coverage in GCC

    下一篇: GCOV static library coverage for C source code