lcov分支覆盖率的分析和总结

2023-10-27

覆盖率显示规则

一行从左到右分别万代表:

1.代码行号(空白代表分支显示不过来产生换行)

2.分支覆盖情况 3.该行调用次数 4.该行源代码以及行覆盖情况

其中,分支覆盖情况详细介绍如下:

中括号代表生成的一对子分支,+代表该子分支被覆盖,-代表该子分支未覆盖,但对应的另一分支被覆盖,#代表两个子分支均未被覆盖。

以if(condition)为例,如果该condition没有子条件,即不是其他条件"与"、"或"产生,那么会产生两个分支,即condition == true condition == false,若只能满足condition == true 或false,则分支覆盖结果为[+ -]或[- +],如果多次调用时condition == true 或false都能满足,则分支覆盖结果为[+ +]。如果condition == true或false都不能发生,那么覆盖结果为[# #](虽然在最简单的条件下这个结果并不会发生)。

行覆盖情况详细介绍如下:

如果该行代码被覆盖到,则其底色为蓝色,没有被覆盖到,则底色为蓝色,若该行是上一行代码的续行,或为return 语句、class声明等,其底色为白色,代表不会进行检测。注意,没有被覆盖的行不会产生分支。

除了常见的逻辑判断外,还有很多产生分支的情况,并且难以完全覆盖,总结如下:

一、 常见逻辑判断

1. if (condition1) - elseif (condition2) - else [if(true)和if(false)除外]

2. for(init;condition/incre)/while(condition) [while(true)、while(false)和for(init;;incre)等没有条件判断除外]

3.条件运算符 condition ? exp1 : exp2

4.switch - case

5.多条件的与或。常见的为return (mulit-condition) ,例如return (x==0 || x==1)。

二、空间/文件管理操作

解析:可能存在操作没有权限、内存分配失败等情况。

1. new /delete 操作符

2. 文件操作:打开、关闭、输出等

例如

cv::FileStorage cameraSettings{std::string(camera_file), cv::FileStorage::READ};
cameraSettings.isOpened()

cameraSettings.close()

以及fprintf等。

3.memcpy

三、宏/内联函数自带的判断

如果宏/内联函数声明中自带判断,那么预处理时会在调用处原地展开,最好的做法是用普通函数代替宏/内联函数,这样不会在每个调用的代码段都产生分支。

四、字符串转换

1.char *到String类

String类的构造函数如下:(加粗部分含有判断)

basic_string(const _CharT* __s, const _Alloc& __a = _Alloc())

      : _M_dataplus(_M_local_data(), __a)

      { _M_construct(__s, __s ? __s + traits_type::length(__s) : __s+npos); }

char *转String时会判断char *是否为nullptr,即自带一个判断。

2.String类到char *

与char *到String类相似。

五、类成员函数调用

即使成员函数内部没有判断,也没有返回值。

六、cpp文件末尾。

七、其他库函数调用。

但是一般情况下只能使用测试样例实现对常见逻辑判断的覆盖,以及使用普通函数代替宏或者内联函数来提高分支覆盖率,其他情况下不能覆盖,只能给予说明。

复杂情形:

一、

if ((std::abs(p.arr[2]) < 1e-10) 
&& (std::abs(p.arr[3]) < 1e-10) 
&& (std::abs(p.arr[4]) < 1e-10) 
&&(std::abs(p.arr[5]) < 1e-10))

该判断共四个子条件,但lcov显示共10个分支,包括四个子条件分别成立和不成立,共八个分支,外加总条件,即这些子条件的与的成立和不成立两个条件,共十个分支:

  1. std::abs(p.arr[2]) < 1e-10 成立
  2. std::abs(p.arr[2]) < 1e-10 不成立
  3. std::abs(p.arr[3]) < 1e-10 成立
  4. std::abs(p.arr[3]) < 1e-10 不成立
  5. std::abs(p.arr[4]) < 1e-10 成立
  6. std::abs(p.arr[4]) < 1e-10 不成立
  7. std::abs(p.arr[5]) < 1e-10 成立
  8. std::abs(p.arr[5]) < 1e-10 不成立
  9. std::abs产生,不明
  10. std::abs产生,不明

二、

if ((!load_with_general_format) &&       
loadCameraModelParametersWithSVFormat(
std::string(camera_file), camera_param)) 
{return camera;}

看起来平平无奇只有两个子条件,其实蕴藏杀机,衍生出了14个分支,分别为:

  1. load_with_general_format == true
  2. load_with_general_format == false
  3. 函数loadCameraModelParametersWithSVFormat返回值为true
  4. 函数loadCameraModelParametersWithSVFormat返回值为false
  5. std::string(camera_file)中camera_file[char *]为空
  6. std::string(camera_file)中camera_file[char *]不为空
  7. 函数调用,不明
  8. 函数调用,不明

以及最后6个分支为函数loadCameraModelParametersWithSVFormat内部有三个if实现,即6个分支,共14个。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

lcov分支覆盖率的分析和总结 的相关文章

  • 无法在 QGLWidget 中设置所需的 OpenGL 版本

    我正在尝试在 Qt 4 8 2 中使用 QGLWidget 我注意到 QGLWidget 创建的默认上下文不显示 OpenGL 3 1 以上的任何输出 Qt wiki 有一个教程 http qt project org wiki How t
  • 为什么 std::vector 可以处理类定义中的不完整类型?

    出现了以下问题 C 标准似乎说 std vector需要一个完整的类型才能工作 看https en cppreference com w cpp container vector https en cppreference com w cp
  • 如何使用C从http下载文件?

    最近几天我试图弄清楚如何从 URL 下载文件 这是我对套接字的第一个挑战 我用它来了解协议 所以我想在没有 cURL 库的情况下只用 C 语言来完成它 我搜索了很多 现在我可以打印页面的源代码 但我认为这与文件不同 我不必只将接收到的数据从
  • 在 LINQ 查询中进行转换

    是否可以在 LINQ 查询中进行强制转换 为了编译器的缘故 下面的代码并不糟糕 但最好将其放入一个查询中 Content content dataStore RootControl as Controls Content List
  • copy_from_user() 错误:目标大小太小

    我正在为内核模块编写 ioctl 处理程序 我想从用户空间复制数据 当我编译禁用优化的代码时 O0 gflags 编译器返回以下错误 include linux thread info h 136 17 error call to bad
  • 使用管道在父级和子级之间传递整数值

    我对如何正确使用 pipeline 在两个进程之间传递整数值有点困惑 在我的程序中 我首先创建一个管道 然后分叉它 我假设我有 两个 管道 据我了解 这是我的任务 我的父母通过 for 循环检查某个操作的整数值 i 增加计数变量 并将值保存
  • 无法在 CUDA 中找到 1 到 100 数字的简单和?

    我正在研究使用 CUDA 的图像处理算法 在我的算法中 我想使用 CUDA 内核找到图像所有像素的总和 所以我在cuda中制作了内核方法 来测量16位灰度图像的所有像素的总和 但我得到了错误的答案 所以我在cuda中编写了一个简单的程序来查
  • 使用 POST 的 HttpWebRequest 的性能

    我有一个用于测试网络服务的小工具 它可以使用 POST 或 GET 调用 Web 服务 使用POST的代码是 public void PerformRequest WebRequest webRequest WebRequest Creat
  • 如何从经过身份验证的 SecurityToken 中获取声明

    我将令牌作为字符串传递到 SOAP 服务中 并验证了该令牌是否有效 我现在有一个 SecurityToken 在调试模式下我可以看到所有声明 特别是我想传递到另一个方法的 userId 声明 我似乎不知道如何获得这些索赔 现在 我解码了令牌
  • 每个元素的 asp.net Web 表单自定义错误消息

    我创建了一个 Web 应用程序 表单 以及后端 SQL 插入和查询 目前我正在显示所有用户错误消息 div style padding 1em div
  • Visual Studio 2013 调试器显示 std::string 的奇怪值

    我有一个大型的 cmake 生成的解决方案 其中包含许多项目 由于某种原因 我无法查看字符串的内容 因为根据调试器 Bx Buf含有一些垃圾 text c str 正确返回 Hello 该问题不仅仅发生在本地字符串上 返回的函数std st
  • Windows Phone 7 - ScrollViewer 值已更改

    我一直在寻找解决方案 但无法找到正确的解决方案 我的网格宽度为 960 并且有ScrollViewer在里面 现在我想知道滚动时滚动的值 水平偏移 我找到的所有解决方案都是针对 wpf silverlight 的 它对我不起作用 Edit
  • 重载算术运算符

    赋值运算符可以声明为 T 运算符 const t 在类中 但不能以这种方式定义算术运算符 它必须是友元函数 我不明白为什么 你能解释一下吗 算术运算符不必须是友元 那么你可以这样定义 MyClass MyClass operator con
  • 为什么连续抛出 2 个异常不会生成无法访问的代码警告?

    为什么以下代码行不会创建编译器警告 void Main throw new Exception throw new Exception 据我所知 编译器应该通知您无法到达第二个抛出异常 这显然是一个编译器错误 它是在 C 3 0 中引入的
  • MINIX内部碎片2

    我正在用 C 语言编写一些软件 它递归地列出给定目录中的所有文件 现在我需要计算出内部碎片 我花了很长时间研究这个问题 发现 ext2 上的内部碎片只发生在最后一个块中 我知道理论上你应该能够从索引节点号获得第一个和最后一个块地址 但我不知
  • 如何在VS2005中使用从.bat而不是.exe启动的外部程序进行调试?

    在我的 c 项目的调试属性中 我选择了 启动外部程序 并选择了我希望将调试器附加到的程序的 exe 但是 现在我需要从 bat 文件而不是 exe 启动程序 但 VS2005 似乎不允许这样做 这可能吗 编辑 为了澄清 我需要调试从 bat
  • 从单应性估计 R/T

    我一直在尝试计算 2 个图像中的特征 然后将这些特征传递回CameraParams R没有运气 特征已成功计算并匹配 但是问题是将它们传递回R t 我明白你必须分解Homography为了使这一点成为可能 我已经使用如下方法完成了 http
  • 在一个解决方案中调用不同项目的方法

    1 个解决方案中有 3 个项目 我对第一个项目中的主文件进行的主要操作 但是我需要调用第三个项目中的方法并使用类 例如 第三个项目有 public DataClasses1DataContext base global WindowsFor
  • C# 多维数组解析

    我有一个多维数组 内容在调试器中看起来像这样 数组设置为 String s new String 6 4 A B Yes C A B Yes C A B No C A B Yes C A B Yes C A B Yes C A B No C
  • 异步/等待 - 是*并发*吗?

    我一直在考虑 C 5 中新的异步内容 并且出现了一个特殊问题 据我了解 await关键字是一个简洁的编译器技巧 语法糖来实现连续传递 http en wikipedia org wiki Continuation passing style

随机推荐

  • MATLAB仿真噪声信号、单多音信号、LFM、2ASK、2FSK、BPSK、16QAM

    文章目录 背景 1 高斯白噪声 2 噪声调幅信号 3 噪声调频信号 4 单音信号 5 多音信号 6 线性扫频信号 7 2ASK信号 8 2FSK信号 9 BPSK信号 10 16QAM信号 缩略对照表 背景 临近毕业整理毕业论文的资料时 看
  • 登录框漏洞

    继上次登陆框引起的血案这个文章之后 时隔一个月笔者又写了续集 呃 升华版 0 00 文章内容结构图 0 01 信息泄露 利用泄露的信息可以大大增加我们的可测试点 从而增加我们的成功率 1 HTML源代码 必看的肯定要属HTML源代码了 源代
  • JavaScript学习笔记:动态集合

    DOM是JavaScript中重要部分之一 在DOM中有一个动态集合 这个动态集合包含节点的集合 NodeList 元素属性的集合 NamedNodeMap 和HTML元素的集合 HTMLCollection 这三个对象都是类数组 Arra
  • 从AD域获取用户AD信息

    public static Dictionary
  • 一个失败的项目

    转眼间 入职已经一年了 在这一年里 我一直在一个项目组 至今这个项目还没有结束 其实说起来这也是一个不大的项目 可是做起来却令人非常头疼 我的同事已经有好几个离开这个项目组了 对于公司来说 这个项目也像是一个鸡肋 首先 这个项目的需求做得不
  • 数据挖掘作业5(个数据库有5个事务,如下表所示。设min_sup=60%,min_conf=80%)

    5 7一个数据库有5个事务 如下表所示 设min sup 60 min conf 80 1 分别用Apriori算法和FP growth算法找出所有频繁项集 比较两种挖掘方法的效率 2 比较穷举法和Apriori算法生成的候选项集的数量 3
  • Qt基础:三、模态和非模态对话框

    QDialog类是所有对话框窗口类的基类 对话框窗口是一个经常用来完成短小任务或者和用户进行简单交互的顶层窗口 按照运行对话框时是否还可以和该程序的其他窗口进行交互 对话框常被分为两类 模态的 modal 阻塞 和非模态的 modeless
  • MediaPipe介绍

    MediaPipe介绍 1 MediaPipe简介 Mediapipe是google的一个开源项目 可以提供开源的 跨平台的常用机器学习 machine learning 方案 Mediapipe实际上是一个集成的机器学习视觉算法的工具库
  • OPENCV的安装

    关于OPENCV的python3 8 1的安装和一些问题解决方案 关于OPENCV 安装这个OPENCV的过程实在是遇到了很多问题 以至于我非常想把我的经验分享出来 以方便大家的安装和使用 python的安装 首先 安装opencv前 必须
  • I5 4590 台式机安装黑苹果最新版笔记

    本文是用四叶草2 4最新版和OSX10 12安装到台式机上 目的是进行IOS开发 安装后win7 和 OSX 双系统 F8选择任意系统 穷逼一枚 只能折腾 以前装过虚拟机 总是用不到最新版 在网上知道可以装最新版os x 10 12 于是折
  • equalsIgnoreCase()和equals()两者区别

    equalsIgnoreCase 不区分大小写 无论大写还是小写比较 都会返回true equals 区分大小写 比较严谨 只能是相同的数字字母比较
  • 基于51单片机简易计算器LCD1602显示

    protues中有KEYPAD SMALLCALC直接就是4 4的矩阵 做完之后才发现了 当时不知道 自己画了一个4 4的矩阵键盘 1 protues仿真图 2 源程序 注释我写的很详细 include reg52 h typedef un
  • c++ 实现猜数字游戏

    在1 100 之间由电脑随机生成一个数 游戏目标就是猜到这个数 c 用whlie语句实现猜数字游戏 注意 1 rand生成的是伪随机数 2 srand通过系统时间生成真正随机数 要写头文件 include
  • C++ OpenCV编译安装教程

    文章目录 环境说明 Cmake编译配置 编译前 配置编译选项 开始正式编译 安装 编写代码测试 参考文章 环境说明 win10 MinGW64 Cmake 下载mingw64 版本 12 1 0 posix seh 下载Cmake 版本3
  • spark+elasticsearch

    环境 elasticsearch 1 7 java 1 8 scala 2 11 8 sbt 1 2 6 spark 2 3 2 代码 package ex import org apache spark sql SparkSession
  • 水果搬运工教你玩Python之list

    水果搬运工教你玩Python之list 一 水果搬运工玩list 二 List思维导图 三 完整代码 一 水果搬运工玩list 这次小明是一名搬运工 专门搬运水果的 完整代码在文章最后面 今天是小明入职的第一天 仓库的仓管说 今天这一排有五
  • 怎么删除w7桌面计算机图标,桌面图标删除不了_Win7桌面有图标删不掉怎么办

    摘要 腾兴网为您分享 Win7桌面有图标删不掉怎么办 智慧医疗 悦作业 一点开 小猿口算等软件知识 以及皮影客 星露谷物语猪车 vivo查找手机 merriamwebster aso100 ipad原生壁纸 高中物理 同步iphone版 记
  • Unity(学习笔记) ---Animator的基本概述

    Unity 动画控制器 1每个Animator Controller都会自带三个状态 Any State Entry和 Exit 1 Any State状态 2 Entry状态 3 Exit状态 2动画状态的属性 1我们可以选中某个自定义状
  • ChatGPT Sorry, you have been blocked解决方法

    很多朋友在使用Chat GPT的时候会遇到Sorry you have been blocked这个提示 都以为自己账号被封了 其实不是的 这是由于的你 被污染了 用的人太多 多数代理通过更换 就可解决 不太靠谱的代理可能就是怎么换都不行
  • lcov分支覆盖率的分析和总结

    覆盖率显示规则 一行从左到右分别万代表 1 代码行号 空白代表分支显示不过来产生换行 2 分支覆盖情况 3 该行调用次数 4 该行源代码以及行覆盖情况 其中 分支覆盖情况详细介绍如下 中括号代表生成的一对子分支 代表该子分支被覆盖 代表该子