gpt4 book ai didi

c++ - LCOV 在函数末尾分支

转载 作者:可可西里 更新时间:2023-11-01 18:28:17 25 4
gpt4 key购买 nike

enter image description here

这个函数的末尾有哪些分支。我该如何覆盖它们?

最佳答案

您正在观察 gcc 生成的用于销毁静态存储持续时间(全局)变量的代码。

您的覆盖显示函数 foo 已被输入 3 次,但是范围末尾附近的计数器显示代码已执行 8 次,包括您查询的分支。

现在您必须考虑编译器将头文件放在翻译单元中并且 gcov 不会完全按照原样查看您的代码,而是将其作为汇编指令的控制流图,分支作为图的边缘.

因此,lcov html 输出中的“foo 作用域结束”实际上并不是 foo 方法作用域的结束,而是 foo 之后包含的所有内容 以及整个翻译单元,包括销毁已在头文件中声明的全局变量。

header 本身并未包含在问题中,但即使是 gcc 生成的最基本的 __static_initialization_and_destruction 程序集也包含许多分支。

请注意,您可能已经包含全局变量,也可能没有 - gcc 仍可能为每个翻译单元生成此代码。


查看gcov的底层输出:

function _Z3fooi called 1 returned 100% blocks executed 50%
1: 4:int foo(int x) {
1: 5: if (x==1) {
branch 0 taken 0% (fallthrough)
branch 1 taken 100%
#####: 6: std::cout << "foo" << std::endl;
call 0 never executed
call 1 never executed
#####: 7: return 0;
-: 8: }
1: 9: return 1;
function _GLOBAL__sub_D__Z3fooi called 1 returned 100% blocks executed 100%
function _GLOBAL__sub_I__Z3fooi called 1 returned 100% blocks executed 100%
function _Z41__static_initialization_and_destruction_0ii called 2 returned 100% blocks executed 100%
6: 10:}
call 0 returned 100%
call 1 returned 100%
branch 2 taken 50% (fallthrough)
branch 3 taken 50%
branch 4 taken 100% (fallthrough)
branch 5 taken 0%
-: 11:

然后查看生成的程序集,修剪以阐明要点:

        ...
ret
.seh_endproc
.def _Z41__static_initialization_and_destruction_0ii; .scl 3; .type 32; .endef
.seh_proc _Z41__static_initialization_and_destruction_0ii
_Z41__static_initialization_and_destruction_0ii:
.LFB978:
...
mov QWORD PTR __gcov0._Z41__static_initialization_and_destruction_0ii[rip], rax
cmp DWORD PTR 16[rbp], 1
jne .L5 <-- BRANCH
mov rax, QWORD PTR __gcov0._Z41__static_initialization_and_destruction_0ii[rip+8]
add rax, 1
mov QWORD PTR __gcov0._Z41__static_initialization_and_destruction_0ii[rip+8], rax
cmp DWORD PTR 24[rbp], 65535
jne .L5 <-- BRANCH
...
.L5:
cmp DWORD PTR 16[rbp], 0
je .L6 <-- BRANCH

关于c++ - LCOV 在函数末尾分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20866420/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com