STATIC和静态分析的必要性

news2024/11/17 7:35:11

​有一款正常工作的软件。那么可以说正常工作的软件都是好软件吗?在漫威的《黑豹》电影中有一个场景我深深地看过。
<图 1> 电影《黑豹》的场景
<图 1> 电影《黑豹》的场景
就算做的好,也有进步的空间!
我认为好的软件也是如此。 即使它可以工作并且没有问题,但总是有改进的空间,并且可能存在尚未发现的错误。

在本文中,我们想讨论动态测试无法捕获的错误、静态分析的必要性以及为什么需要修复缺陷。

动态测试不能发现的BUG
有哪些方法可以找到动态测试都没有发现的bug?
​​​
首先,让我们谈谈为什么会出现错误。 产生错误的原因有无数种,但大致可分为以下 4 类。
​​​

  1. 未考虑的案例(缺失需求)
  2. 意外行为(需求被误解)
  3. 异常输入(缺少异常处理)
    4.由于简单的编码错误导致的Bug
    ​​​
    动态测试可以在一定程度上覆盖第1点和第2点。 通过组织良好的需求、100% 的覆盖率和 QA 流程,可以找出大多数bug。 需要我们考虑的是第 3 点和第 4 点,它们很容易被忽略。

    异常输入(缺少异常处理)
    为什么动态测试不能捕捉到异常输入?
    异常输入不能很好地作为动态测试的案例。 如果将其作为动态测试用例,则不会有错误,因为它是预期的输入。​​​
    最简单的例子是除以零或缓冲区溢出等错误。 这类 bug 最大的问题是它们大多发生在软件发布之后。

    单纯由代码编写导致的bug
    动态测试没有检测到哪些编码错误?
    一个典型的例子是内存泄漏。 通常,只有当程序运行时间较长,才会发现内存泄漏。
    ​​​
    动态测试中发现内存泄漏并不容易,需要在开发阶段快速检查结果。 此外,在内存泄漏的情况下,即使找到了相应的错误,也很难找出泄漏发生的代码位置。
    由于异常输入或编码错误,通常出现在软件运行中,而不是在开发中。 为了便于解释,我们将这些错误统称为运行错误。
    ​​​
    接下来,我们来谈谈如何避免运行错误。

    [如何避免运行错误]

    让我们看看需要哪些步骤来防止运行错误。
    最好的方法是获得大量的实践或经验。 经验丰富的开发人员通过大量的编码经验提前考虑运行错误。那么,经验和实践有限的开发人员是否需要针对运行错误进行无防御的开发?
    ​​​
    通常,在开发过程中会执行结对编码、mob 编码和代码评审等过程,以提前预防这些 bug。 但是,如果项目日程紧迫,并且需要将产品快速推向市场,那么实际上并没有太多时间来进行这些活动。 此外,由于经验丰富的开发人员的时间成本很高,因此代码评审、结对编码和mob编码等活动对公司或团队来说效率不高。

    静态分析(Static Analysis)必要的原因

    除了经验丰富的开发人员的活动之外,还有一种低成本的替代方案,那就是静态分析。
    ​​​
    通过执行静态分析,可以毫不费力地避免诸如运行错误之类的错误。静态分析根据经验丰富的开发人员的专业知识或现场已经发生的许多运行错误的案例来创建规则。然后,使用创建的规则对源代码进行分析。源代码静态分析会检查异常输入、程序的流程或在审查中遗漏的代码。这意味着您找到动态测试或代码审查等活动无法发现的bug。
    ​​​
    静态分析不需要执行代码。因为即使在未完成的代码上也可以进行分析,所以可以比动态测试更早地发现错误。与动态测试相比,它还具有在相对较短的时间内发现错误的优势。
    ​​​
    下图是SureSofttech的代表性静态分析解决方案CodeScroll STATIC的执行界面。
    随着在任务关键域中检查编码规则和运行错误(Runtime Error)的重要性增加,该项目规模开始加大。导致静态分析时间和通信成本的增加,使得修复缺陷变得困难。 STATIC 就是为了解决这些问题而开发的解决方案,通过提供一组丰富的编码规则,从而使项目能够高效的进行。
    <图 2> CODESCROLL STATIC memory leak BUG检出结果画面
    <图 2> CODESCROLL STATIC memory leak BUG检出结果画面
    <图 3> CODESCROLL STATIC Buffer Overrun 检出画面
    <图 3> CODESCROLL STATIC Buffer Overrun 检出画面
    让我们看看我们需要静态分析的其他原因。
    ​​​
    正如本文开头所提到的,即使是运行良好的软件也有改进的空间。静态分析不仅能发现bug,还能发现有改进空间的代码。
    静态分析还提供有关编码风格的规则和代码质量度量。
    ​​​
    编码风格规则检查是否按照编程语言提供的规则或公司设置的规则进行编程。由于这些规则是考虑到代码的维护和可读性而制定的,因此强烈建议遵循它们。
    ​​​
    代码质量度量提供代码的复杂性、可扩展性和可移植性的数字表示。我们可以通过使用质量指标来量化不可见代码的质量,为了定量化数值,我们可以控制我们的工作。如果质量度量管理没有在开发早期应用,成本可能会增加并最终放弃改进。如果您从开发的早期阶段管理质量指标,您可以发布具有低技术债务的产品。
    <图4> CODESCROLL STATIC Metric 画面
    <图4> CODESCROLL STATIC Metric 画面
    动态测试 VS 静态测试
    动态测试是最昂贵的测试方法之一。 随着源代码的增加和越来越复杂,需要维护的测试代码的数量也在增加。 另外,由于测试代码也是一个编码过程,自然会出现错误,测试代码中的错误极大地影响了产品的质量。
    ​​​
    当然,动态和静态测试发现的 bug 的类型和性质略有不同。 最好同时进行这两项活动,但是… . 如果您必须以相同的时间和成本在两个测试之间进行选择,我会毫不犹豫地推荐静态分析。

    尽可能修改
    我们经常看到进行静态分析而源代码没有进行相应修改的情况。在某些情况下,它会被跳过,因为它是微不足道的部分,或者因为它是与程序运行无关的缺陷。虽然考虑修复的时间和成本很重要,但尽可能修复代码以减少所有故障。
    ​​​
    经验丰富的开发人员犯的错误更少。因为经验与习惯有关,而习惯来自于重复。不断修复错误代码对产品有好处,但也有助于开发者人员的编码习惯。我认为有经验的开发者都是有良好习惯的开发者。让我们假设静态分析不是一项繁琐的任务,而是帮助开发人员提高技能并推进他们的职业生涯。如果有一天,我第一次在静态分析器上运行代码,它的缺陷为零,那不是很好吗?静态分析和缺陷修复对开发人员比对正在发布的软件更有利。
    ​​​
    即使制作精良,仍有改进的余地。
    ​​​
    我期待着有一天我可以尽可能地改进它,并使我的经验成为一个不需要静态分析的优秀开发人员。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/111673.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue2.x中的Vuex

目录 一、vuex是什么 1.1、概念 1.2、Github地址 1.3、使用场景 1.4、同胞传值 1.5、Vuex工作原理 1.6、搭建Vuex环境 二、求和案例 2.1、getters用法 2.2、mapState与mapGetters 2.3、mapActions与mapMutations 2.4、Vuex模块化命名空间namespace 2.5、头插人员案…

Nacos 寻址机制

目录 1. 什么是寻址机制 2. 源码讲解 MemberLookup AbstractMemberLookup 2.1 单机寻址 2.2. 文件寻址 2.3 地址服务器寻址 1. 什么是寻址机制 假设存在一个 Nacos 集群&#xff0c;其内部具有 A , B , C 三个节点。 客户端如何决定向集群中的哪个节点发送请求 在 appl…

基于Springboot+Mybatis+mysql+element-vue高校就业管理系统

基于SpringbootMybatismysqlelement-vue高校就业管理系统一、系统介绍二、功能展示1.用户登陆注册2.个人信息(学生端)3.查看企业岗位信息&#xff08;学生端&#xff09;4.我的应聘(学生端)5.学生信息管理&#xff08;辅导员&#xff09;6.三方协议书审核&#xff08;辅导员&am…

向用户展示推荐算法,TikTok主动“透明化”

获悉&#xff0c;近日TikTok宣布推出一项新功能&#xff0c;用户可以查看推荐主页&#xff08;For You&#xff09;中某个视频被推荐的原因&#xff0c;这一功能让用户拥有了更多的知情权&#xff0c;让TikTok的算法变得更透明化。新功能新功能推出后&#xff0c;用户可以在视频…

Diskless:云与互联网数据中心的下一个大变革

作为数字经济的核心产业&#xff0c;云与互联网数据中心正面临着下一波技术浪潮的冲击&#xff1a;云原生应用和Serverless无服务器计算的全面普及&#xff0c;推动数据中心底层硬件资源彻底解耦池化和重组整合&#xff0c;形成新的扁平分层——新型存算分离硬件架构&#xff0…

定时循环执行Python脚本 —— 定时执行专家

目录 提前准备 方案一、执行DOS命令 方式 1、在《定时执行专家》里新建“执行DOS命令”任务 方案二、执行脚本文件 方式 1、编写 .bat 脚本&#xff0c;用来执行Python脚本 2、在《定时执行专家》里新建“执行脚本文件”任务 本文提供两种使用《定时执行专家》定时循环执…

挑选在线客服系统的七大注意事项

在线客服系统是客户关怀软件&#xff0c;能够为访客和客服提供即时对话&#xff0c;对访客来说&#xff0c;能够为其提供一个快速、高效的沟通方式&#xff0c;即时性的互动提高访客沟通体验&#xff1b;对客服来说&#xff0c;有效提高客服效率,为客服人员节省大量宝贵时间。 …

机器学习 | 支持向量机

一.基本原理 SVM是一种二分类模型 基本思想&#xff1a;在特征空间中寻找间隔最大的分离超平面使数据得到高效的二分类&#xff0c;具体来讲&#xff0c;有三种情况&#xff08;不加核函数的话就是线性模型&#xff0c;加了之后才会升级为一个非线性模型&#xff09; 当训练…

玩以太坊链上项目的必备技能(Constant 和 Immutable 状态变量-Solidity之旅十六)

constant&#xff08;常量&#xff09; 说到常量这一概念&#xff0c;拥有现代编程经历的您&#xff0c;对这一词再熟悉不过了。 常量&#xff0c;常量&#xff0c;顾名思义便是变量值始终不变&#xff0c;这在很多面向对象程序语言中都有。 相对 Solidity 来说&#xff0c;…

Web入门开发【六】- 域名认证

欢迎来到霍大侠的小院&#xff0c;我们来学习Web入门开发的系列课程。 首先我们来了解下这个课程能学到什么&#xff1f; 1、你将可以掌握Web网站的开发全过程。 2、了解基础的HTML&#xff0c;CSS&#xff0c;JavaScript语言。 3、开发自己的第一个网站。 4、认识很多对编…

LabVIEW如何减少下一代测试系统中的硬件过时2

LabVIEW如何减少下一代测试系统中的硬件过时2 HAL最佳实践 从通用测试函数中分离测试逻辑 一个重要的最佳实践是将特定于dut的测试逻辑与更通用的、可重用的测试模块分离&#xff0c;以提高重用性并减少重新验证和文档成本。解耦和使层模块化可以改进系统架构&#xff0c;使…

08 面向对象三大特性

目录 一 封装 1.1 概述 1.2 为什么要进行封装&#xff1f; 1.3 Java中的封装 1.4 四种访问权限修饰符 1.5 练习 二 继承 2.1 继承的由来 2.2 继承的好处 2.3 语法格式 2.4 继承的特点之一&#xff1a;成员变量 2.4.1 父类成员变量私有化 2.4.2 父类和子类成员变量…

二维刚体变换

欢迎访问我的博客首页。 二维刚体变换1. 二维旋转矩阵2. 参考1. 二维旋转矩阵 二维世界坐标系中任一点 P(x,y)P(x, y)P(x,y) 绕原点逆时针旋转 θ\thetaθ 度到点 P′(x′,y′)P(x, y)P′(x′,y′)&#xff0c;这个旋转可以用一个二维矩阵表示 R逆[cosθ−sinθsinθcosθ].(1.…

女文科生转行做程序员,工资涨了4倍,戏说“我是女生”怕啥秃顶

前几天&#xff0c;有一个女生在后台留言&#xff0c;问她要不要毕业后做程序员工作&#xff1f;自己特别纠结。 情况是这样的&#xff1a;她今年大学毕业&#xff0c;学计算机专业&#xff0c;有一定兴趣&#xff0c;但父母比较反对&#xff0c;列举了很多程序员熬夜加班的痛…

Fragment案例

Fragment案例 1.案例要求 框架布局项目难点&#xff1a;1 导航栏的实现&#xff0c;显示导航按钮、切换Fragment 2 每个Fragment的创建、显示 3 Fragment的跳转&#xff08;从新闻列表到新闻详情&#xff0c;再返回&#xff09; 涉及的技术&#xff1a;用RadioGroup及RadioButt…

【学习笔记07】vue3移动端的适配

目录1、创建一个项目并启动2、设置根字体大小和单位转化3、去掉边框距离4、css的嵌套使用5、连接到手机上显示6、vant ui 库的使用6.1 基础用法6.2 底部导航栏7、模拟锤子商城7.1 请求数据7.2 解决跨越7.3 组件切换7.4 轮播图的实现1、创建一个项目并启动 npm init vuelatestcd…

【OpenCV-Python】教程:7-4 KMeans 应用

OpenCV Python KMeans 应用 【目标】 使用 cv2.kmeans 对数据进行聚类 【代码】 1. 单个特征的 KMeans # 单特征数据的聚类 import numpy as np import cv2 from matplotlib import pyplot as pltx np.random.randint(25,100,25) y np.random.randint(175,255,25)z np.h…

Linux系统下管理员账号root忘记密码怎么找回

忘记root密码一般有两种情况&#xff1a; 一种是登上了root账号&#xff0c;但是忘记密码了&#xff0c;这种情况比较简单&#xff0c;在终端即可实现修改密码&#xff1b; 一种是登录不上root账号&#xff0c;这种情况稍微麻烦些&#xff0c;需要开机时进行一系列操作。 不能登…

【源码共读】Css-In-Js 的实现 classNames 库

classNames是一个简单的且实用的JavaScript应用程序&#xff0c;可以有条件的将多个类名组合在一起。它是一个非常有用的工具&#xff0c;可以用来动态的添加或者删除类名。 仓库地址&#xff1a;classNames 使用 根据classNames的README&#xff0c;可以发现库的作者对这个…

Spring 事务失效的常见八大场景,注意避坑

1. 抛出检查异常导致事务不能正确回滚 Servicepublic class Service1 {Autowiredprivate AccountMapper accountMapper;Transactionalpublic void transfer(int from, int to, int amount) throws FileNotFoundException {int fromBalance accountMapper.findBalanceBy(from);…