0

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

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

4

1 回答 1

0

工具使用了不同类型的覆盖范围,包括

  • 线路覆盖
  • 报表覆盖率
  • 分支/决策覆盖

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

我们有:

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

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

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

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

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

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

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

于 2020-08-07T12:53:21.100 回答