(a&;b)报表中有多少分支机构?根据gcov:4
我使用“gcc-fprofile arcs-ftest coverage test.c”编译了以下程序: 运行程序后,调用“gcov-bc test.c”报告至少执行了一次4个分支中的50%。为什么gcov说该计划有四个分支,而不是两个?在运行以下程序后,gcov正确地报告两个分支中的50%至少执行了一次:(a&;b)报表中有多少分支机构?根据gcov:4,c,gcc,code-coverage,gcov,C,Gcc,Code Coverage,Gcov,我使用“gcc-fprofile arcs-ftest coverage test.c”编译了以下程序: 运行程序后,调用“gcov-bc test.c”报告至少执行了一次4个分支中的50%。为什么gcov说该计划有四个分支,而不是两个?在运行以下程序后,gcov正确地报告两个分支中的50%至少执行了一次: int main() { int a = 1; if (a) a = 0; else a = 1; } 显然,gcov正在考虑a&b如下: if(a) { //
int main() {
int a = 1;
if (a)
a = 0;
else
a = 1;
}
显然,
gcov
正在考虑a&b
如下:
if(a) { // branch 1
if(b) { // branch 2
1;
} else { // branch 3
0;
}
} else { // branch 4
0;
}
虽然我相当确定实际的CPU指令将转换为单个分支。是的,实际的汇编程序输出只包含一个条件分支。为什么gcov选择以这种方式解释短路运算符的分支覆盖率,我并不清楚。将其解释为“if(a){result=b;}else{result=0;}”对我来说似乎更合理(result表示a&&b的结果)。@HermannSpeiche:这是错误的。
a和&b
的结果是0或1,而不是0或b
。
if(a) { // branch 1
if(b) { // branch 2
1;
} else { // branch 3
0;
}
} else { // branch 4
0;
}