当前位置: 首页 > news >正文

静态分析和动态分析

在开发早期,发现并修复bug在许多方面都有好处。它可以减少开发时间,降低成本,并且防止数据泄露或其他安全漏洞。特别是对于DevOps,尽早持续地将测试纳入SDLC软件开发生命周期是非常有帮助的。

这就是动态和静态分析测试的用武之地。它们在SDLC中各自服务于不同的目的,同时也为任何开发团队提供独特且几乎即时的投资回报率。

静态与动态分析:了解两者的区别

静态代码分析是一个广义的术语,用于描述几种不同类型的分析。然而,所有这些分析都有一个共同的特征:它们不需要代码执行即可运行。

相比之下,动态分析需要代码执行。尽管还有其他区别,但这一特征是区分这两种测试方法的根本因素。

这也意味着每种方法在开发过程的不同阶段都提供了不同的好处。为了理解这些差异,我们可以回顾以下内容。

  • 每种策略需要什么。

  • 需要使用测试类型。

  • 协助该过程的工具。

什么是静态分析?

静态代码分析测试可以包括各种类型,其中两种主要的类型是基于模式的测试和基于流的测试。

基于模式的静态分析可以查找出违反定义编码规则的代码。除了确保代码满足合规性或内部计划的统一期望外,它还可以帮助团队预防缺陷,如资源泄漏、性能和安全问题、逻辑错误和API滥用等。

基于流的静态分析可以查找和分析代码的各种路径。这可以通过控制流(执行行(hang)的顺序)和数据流(变量或类似实体可以被创建、改变、使用和销毁的顺序)来实现。这些过程可以暴露出导致关键缺陷的问题,例如:

  • 内存损坏(缓冲区覆盖)

  • 内存访问违规

  • 空指针解引用

  • 竞态条件(Race conditions)

  • 死锁(Deadlocks)

它还可以通过绕过安全关键代码(如身份验证或加密代码)的路径来检测安全问题。

此外,度量分析包括对代码的各个方面进行衡量和可视化。它可以帮助检测现有的缺陷,但更常见的是,为后续代码维护时,提前消除可能带来未知缺陷的可能性。这是通过发现代码中的复杂性和冗长性来完成的,例如:

  • 过大的组件

  • 过多的循环嵌套

  • 一系列过于冗长的判定

  • 复杂的组件间依赖关系

什么是动态分析?

动态分析有时被称为运行时错误检测,动态分析是测试类型之间的区别开始变得模糊的地方。动态应用程序安全测试(DAST)是一种分析测试,目的是检查测试项目而不是执行它。这种白盒测试检查的是内部行为,并非外部行为。然而测试中的代码必须被执行。这是通过运行与动态测试相同的黑盒测试来完成的。

这意味着动态分析可以在内部故障发生的瞬间检测并报告这些故障。这使得测试人员更容易精确地将这些故障与测试行动关联起来,以便进行事故报告。类似于好的静态分析,DAST提供了完整的技术细节,使开发人员能够隔离和修复潜在的缺陷。

DAST还扩展了所有级别的测试能力,从单元测试到验收,使检测内部故障成为可能,这些故障指向在测试停止后发生或将要发生的无法观察到的外部故障。

静态分析的利弊

凡事皆有利弊,静态分析测试也有优点和缺点。

静态分析的利弊

优点:缺点
1. 在不执行源代码的情况下评估源代码;1. 可能返回误报和漏报,会分散开发人员的注意力;
2. 分析整个代码的漏洞和错误;2. 手动操作需要很长时间;
3. 遵循定制的、定义好的规则;3. 无法找到运行时环境中出现的错误或漏洞;
4. 增强开发人员的责任感;4. 决定应用哪些行业编码标准可能会令人困扰;
5. 具有自动化能力;5. 确定偏离违反规则是否合适,可能具有挑战性。
6. 尽早突出错误并减少修复漏洞所需的时间。

虽然这些缺点看起来令人生畏,但静态分析的缺点可以用两件事来补充:

  • 自动化静态分析

  • 使用动态分析技术

为什么静态代码分析如此有价值?

所有这些类型的静态分析都有一个共同点:它们会涉及扫描或检查程序源代码。

这是一种快速而简单的暴露关键缺陷的方法。他实现了100%的覆盖率和100%的客观结果。

不断地执行这样的静态代码分析是有意义的,因为它提供了这些可操作的结果,减少了成本和开发时间,增加了代码覆盖率,等等。

超越静态分析的范畴

静态扫描提供信息来帮助预测代码集成和执行时可能会发生的情况。它根据工具认为的缺陷标准来检测缺陷。通常也可以根据您的偏好和优先级进行定制。

但是,工具不能告诉您测试中或生产中的系统何时交付了意外的、不适当的或不准确的结果。

这里的挑战是难以观察意想不到的行为。例如,对于用户、测试人员或测试执行工具来说,事务可能看起来正确地进行,但实际上,组件抛出了一个未处理的异常,并且未能正确地处理它。一个控制系统可能会在测试三天内快速正确地响应,但可能会在生产的第四天出现内存泄漏并导致崩溃。

通过使用静态代码分析工具修复所有检测到的缺陷,并不能保证不会有其他缺陷导致类似的失败。这就是为什么将失败的定义应用于内部和外部行为是很重要的,即使在集成之后也是如此。内部故障必须在外部故障出现之前检测到。

结合静态和动态分析的最佳实践

将静态和动态分析相结合,是获得可操作结果、减少错误发生、增加错误检测并创建更安全代码的最佳选择。两者并无优劣之分。它们像精心制作的瑞士手表的所有齿轮一样协同工作。

要同时使用静态和动态分析,请遵循这些最佳实践:

  • 将它们与符合您需求的手动和自动化解决方案一起使用;

  • 使代码对其他开发人员具有可读性和可重用性;

  • 在SDLC的正确点使用正确的方法——在早期使用静态方法,在运行时环境中使用动态方法;

  • 利用这两种方法对您的项目进行更全面的概述;

  • 避免只依赖一种测试方法的陷阱,一个小的疏忽可能导致大的问题。

将静态和动态分析相结合,使团队能够定位更大范围和数量的代码威胁。

获取有价值的见解,来选择最适合您团队的软件测试解决方案。

相关文章:

静态分析和动态分析

在开发早期,发现并修复bug在许多方面都有好处。它可以减少开发时间,降低成本,并且防止数据泄露或其他安全漏洞。特别是对于DevOps,尽早持续地将测试纳入SDLC软件开发生命周期是非常有帮助的。 这就是动态和静态分析测试的用武之地…...

代码随想录_贪心_leetcode 1005 134

leetcode 1005. K 次取反后最大化的数组和 1005. K 次取反后最大化的数组和 给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组: 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以…...

笔记:对多维torch进行任意维度的多“行”操作

如何取出多维torch指定维度的指定“行” 从二维torch开始新建torch取出某一行取出某一列一次性取出多行取出连续的多行取出不连续的多行 一次取出多列取出连续的多列取出不连续的多列 考虑三维torch取出三维torch的任意两行(means 在dim0上操作)取出连续…...

【VSCode】1、VSCode 如何连接服务器

文章目录 一、安装 remote-ssh 插件二、直接连接三、配置 SSH 公匙,免密登录 一、安装 remote-ssh 插件 点击插件搜索框,搜 remote-ssh,点击安装 安装完成后就会出现下面的图标: 二、直接连接 点击加号,输入 ssh 连接…...

AI工具:通过智能实现工作和学习效率的革命化

AI工具是指一系列人工智能技术和工具,包括机器学习、深度学习、自然语言处理、计算机视觉等。这些工具可以帮助开发人员和数据科学家通过处理和分析海量数据来自动识别和解决问题,提供智能的决策和预测模型。常见的AI工具包括TensorFlow、PyTorch、Keras…...

static 和构造方法

文章目录 static构造方法内存中数据的存储方式示例 static 具体对象的属性,称之为对象属性,成员属性,实例属性。 具体对象的方法,称之为对象方法,成员方法,实例方法。 静态:static 和具体对…...

【Linux 裸机篇(八)】I.MX6U EPIT 定时器中断、定时器按键消抖

目录 一、EPIT 定时器简介二、定时器按键消抖 一、EPIT 定时器简介 EPIT 的全称是: Enhanced Periodic Interrupt Timer,直译过来就是增强的周期中断定时器,它主要是完成周期性中断定时的。学过 STM32 的话应该知道, STM32 里面的…...

Web安全 XSS靶场搭建(玩转整个XSS环境.)

Web安全 XSS靶场搭建 XSS又叫CSS(Cross Site Script)跨站脚本攻击,指的是攻击者在Web页面,插入恶意JS代码,当用户浏览该页之时,嵌入其中JS代码就会被执行,从而达到攻击的目的.(包含…...

前端开发技术——DOM(上)

一.单选题(共4题,44.4分) 1 下列选项中,关于事件的描述错误的是() A、 事件指的是可以被JavaScript侦测到的行为 B、 事件驱动程序指的是事件触发后要执行的代码 C、 事件源是指触发的事件 D、 事件的种类称为事件…...

银河麒麟v10服务器版安装OpenDDS

1. OpenDDS简介 OpenDDS是OMG数据分发服务(DDS)的一种开源实现,它遵循实时系统v1.2的DDS规范(OMG Document formal/07-01-01)和实时公布/订阅互操作性通信协议v2.1的DDS-RTPS规范(OMG Document formal/2010-11-01)。OpenDDS由OCI公司设计和维护,可从http…...

curl方式调用电商API接口示例 详细介绍

cURL是一个利用URL语法在命令行下工作的文件传输工具,1997年首次发行。它支持文件上传和下载,所以是综合传输工具,但按传统,习惯称cURL为下载工具。cURL还包含了用于程序开发的libcurl。 cURL支持的通信协议有FTP、FTPS、HTTP、H…...

Duboo介绍与入门

文章目录 1、Dubbo的前世今生2、Dubbo的快速入门2.1、Dubbo的基本架构2.2、Nacos2.3、管理后台2.4、入门案例2.4.1、服务提供者搭建环境代码实现配置文件 2.4.2、服务消费者搭建环境代码实现配置文件 最后说一句 1、Dubbo的前世今生 2011年10月27日,阿里巴巴开源了…...

人工智能中(Pytorch)框架下模型训练效果的提升方法

大家好,我是微学AI,今天给大家介绍一下人工智能中(Pytorch)框架下模型训练效果的提升方法。随着深度学习技术的快速发展,越来越多的应用场景需要建立复杂的、高精度的深度学习模型。为了实现这些目标,必须采用一系列复杂的技术来提…...

树莓派CSI摄像头使用python调用opencv库函数进行运动检测识别

目录 一、完成摄像头的调用 二、利用python调用opencv库函数对图像进行处理 2.1 图像处理大体流程 2.2 opencv调用函数的参数以及含义 2.2.1 ret, img cap.read() 读取帧图像 2.2.2 cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 灰度图像 2.2.3 gray_diff_img cv2.absdiff(g…...

Parameters(in)、Parameters(out) and Parameters(inout)

0前言 参数类型(Parameters)指的是函数参数在调用时所具有的性质,从而对函数的调用方式产生影响。在 C 语言中,存在三种不同类型的函数参数:Parameters(in)、Parameters(out) 和 Parameters(inout) 1定义 Parameter…...

jstat命令查看jvm内存情况及GC内存变化

命令格式 jstat [Options] pid [interval] [count] 参数说明: Options,选项,一般使用 -gc、-gccapacity查看gc情况 pid,VM的进程号,即当前运行的java进程号 interval,间隔时间(按该时间频率自动刷新当前内存…...

java 图形化小工具Abstract Window Toolit :画笔Graphics,画布Canvas(),弹球小游戏

画笔Graphics Java中提供了Graphics类,他是一个抽象的画笔,可以在Canvas组件(画布)上绘制丰富多彩的几何图和位图。 Graphics常用的画图方法如下: drawLine(): 绘制直线drawString(): 绘制字符串drawRect(): 绘制矩形drawRoundRect(): 绘制…...

HCIA-RS实验-STP和RSTP(1)

这篇文章开始前,先简单说下这2个协议; 本文介绍了STP和RSTP的基本原理、优缺点以及应用场景。STP和RSTP都是生成树协议,主要作用于避免网络中的环路,保证数据包能够正常转发。在实际应用中,需要根据实际情况选择合适的…...

Leetcodes刷题之删除链表的倒数N个结点和删除链表的中间的结点

吾心信其可行,则移山填海之难,终有成功之日。 --孙中山 目录 🍉一.删除链表的倒数N个结点 🌻1.双指针 🍁2.求链表的长度 🌸二.删除链表的中间的结点 🍉一.删除链…...

Java-数据结构-并查集<二>

一.并查集的简单介绍 二. 并查集的主要构成和实现方式 三.HashMap模板和数组模板 由于在下文的模板基本一致,不再每次都罗列,大体的模板如下,若有错误可以在leetcode找到对应的题目解答,已经附上连接。 HashMap class UnionFi…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子&#xff08…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...

基于服务器使用 apt 安装、配置 Nginx

🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)

UniApp 集成腾讯云 IM 富媒体消息全攻略&#xff08;地理位置/文件&#xff09; 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型&#xff0c;核心实现方式&#xff1a; 标准消息类型&#xff1a;直接使用 SDK 内置类型&#xff08;文件、图片等&#xff09;自…...