【问题标题】:gcov and unconditional loop coveragegcov 和无条件循环覆盖
【发布时间】:2020-08-06 15:55:30
【问题描述】:

有谁知道 gcov(用于 C 和 C++)如何处理条件循环和无条件循环。具体来说,如果您有条件循环,则需要为循环测试 0、1 或更多。如果您有一个无条件循环,则不需要任何额外的测试。这是因为无论循环的输入是什么,无条件循环总是会执行 X 次(想想一个总是从 0 开始,总是以一个 const 值结束的 for 循环)。

问题是,gcov(和相关的报告工具)如何处理这个问题。如果循环是无条件的,则无法测试 0、1 或更多。这些工具是否考虑到了这一点,从而不会对您的总代码覆盖率产生负面影响?

【问题讨论】:

  • 我不明白。 gcov 只计算源代码行的执行次数。如果循环是“有条件的”或“无条件的”(无论这意味着什么),它有什么区别?
  • @FredLarson:也有分支覆盖,但 OP 对(非)条件循环的定义似乎与覆盖无关。
  • 对我来说while (true){ /*..*/} 是无条件循环(无条件跳转(即使编译器可能生成不需要的分支,这确实可能对覆盖工具产生负面影响))。 for (int i = 0; i != 42; ++i) 有条件分支,并且两个分支都在常规运行中覆盖(没有 break)。 0、1、2+ 次运行似乎与路径或决策覆盖率更相关。
  • @Jarod42 这可能有助于参考:partiu.loggi.com/…
  • @FredLarson,请参阅上面评论中的链接,但如果 gcov 仅计算一行执行的次数,我想知道 CodeCov 之类的工具如何测量循环和分支条件。我觉得那里必须有更多信息,因为他们也需要区分 MC/DC 分支之间的区别,而您无法从简单的行数中获得。

标签: c++ c code-coverage codecov


【解决方案1】:

工具使用不同类型的覆盖率,包括

  • 线路覆盖率
  • 语句覆盖率
  • 分支/决策覆盖率

f1(); if (a || b) { f2(); } f3();

我们有:

  • 1 行
  • 5 条语句(abf1f2f3
  • 4 个分支 (a==(true|false), b==(true|false) -> 2 + 2)
  • 3 条路径({a, b}=={true, _}{a, b}=={false, false}{a, b}=={false, true}

这些指标之间没有真正的关系

一次运行将测试一条路径以及任意数量的其他指标。

您的无条件循环(如for (int i : {4, 8, 15, 16, 23, 42}))确实不会增加路径数,只会将分支数增加一,并增加语句​​数。但是任何采用该无条件循环的路径都将涵盖无条件循环的所有语句和分支。

您的条件循环 (for (int i : my_numbers)) 会将分支计数增加 1,可能会增加路径数(容器的空性已由路径的上一步修复)并增加语句​​数。 如果您使用非空容器运行路径,您将涵盖所有语句和分支,但实际上并不需要所有路径。

大多数工具不使用路径覆盖(因为它增长太多而无法使用)

条件与无条件循环仅对这些指标很重要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 2020-02-27
    • 2015-08-20
    • 1970-01-01
    • 2011-06-06
    • 2011-08-07
    • 2013-09-27
    相关资源
    最近更新 更多