我正在构建一个tool,它实际上是lcov的替代方案。我试图使它生成的默认分支覆盖范围内的噪声尽可能小。分支噪声的一个来源似乎是初始化列表:
#include <vector>
#include <string>
using namespace std;
struct A {
vector<string> reference_tokens;
};
int main() {
A a;
vector<string> rt = {"a", "b", "c"};
a.reference_tokens = {rt[0]};
return 0;
}
在生成此代码段的覆盖范围时,我得到:
9 : : struct A {
10 : : vector<string> reference_tokens;
11 : : };
12 : :
13 : 1 : int main() {
14 : 2 : A a;
15 : :
16 [ + - ][ + - ]: 6 : vector<string> rt = {"a", "b", "c"};
[ + - ][ + - ]
17 : :
18 [ + - ][ + - ]: 2 : a.reference_tokens = {rt[0]};
[ + + ][ - - ]
19 : 1 : return 0;
20 : : }
现在,我意识到GCC插入了用于处理异常的分支。但是,如果我过滤掉异常分支,则仍然有:
9 : : struct A {
10 : : vector<string> reference_tokens;
11 : : };
12 : :
13 : 1 : int main() {
14 : 2 : A a;
15 : :
16 : 6 : vector<string> rt = {"a", "b", "c"};
17 : :
18 [ + + ][ - - ]: 2 : a.reference_tokens = {rt[0]};
19 : 1 : return 0;
20 : : }
我不确定这四个分支[ + + ][ - - ]
是干什么的。根据gcov,它们不是特殊的分支,似乎总是1:1。例如,更大的初始化列表将导致[ + + ][ + + ][ + + ][ - - ][ - - ][ - - ]
非异常分支。
所以我的问题是...这些分支是什么?可以到达吗?是否可以安全消除噪音?