一文了解全面静态代码分析

2023-11-18

在开发具有安全性、可靠性和合规性的软件时,全面静态代码分析是一种有效的方法。在这里,我们将就静态分析而言,讨论全面静态代码分析的不同之处,阐述全面静态代码分析的重要性,以及如何进行全面静态代码分析。

什么是全面静态代码分析

全面静态代码分析,或只是全面分析,是指分析结果的完整性或“健全性”。静态代码分析工具据称能够提供可靠的分析结果,这意味着如果某个软件中存在特定的缺陷或漏洞,该分析工具将报告上述问题。

如果不确实是否存在问题,则提供某种形式的警告,这样就不会“漏掉”任何问题。

(注:这些问题在Helix QAC工具中被归类为可能存在的问题,如无必要,则可以不进行全面分析。)

全面静态代码分析不同于其他形式的静态分析,其他形式的静态分析结果可能基于在一定时间或资源范围内可能发生的情况。

鉴于程序的运行时行为建模需要某些近似值(例如,缺乏对程序输入或操作系统状态的了解),全面静态代码分析需要采用Over-approximations(过近似)。

Over-approximations(过近似)用以保证不存在漏报(对于给定的漏洞类型),而under-approximations(下近似)首先保证的是没有误报而却可能有漏报。

而其他形式的静态分析没有表现出这种严格性,可能既包含Over-approximations(过近似) 又包含 under-approximations(下近似)。
 

全面静态代码分析工具和非全面静态代码分析工具可能会为程序的特定部分提供一份健康报告,而全面静态代码分析工具引擎提供了额外的保证,即在提供这一健康证明的同时,所有可能性和所有路径均已得到验证。

全面静态代码分析工具的工作原理
 

当提到全面分析时,我们通常考虑更复杂的过程间和过程内控制以及数据流分析形式,与当今最先进的静态分析工具的工作原理相同。

相较于更为简单的代码语法和语义分析,不同之处在于控制和数据流静态分析通常与检测更为复杂的问题有关,包括:

  • 空指针错误引用
  • 数组或缓冲区下溢和上溢
  • 使用未初始化的对象
  • 分配内存和释放内存异常
  • 数字上溢、下溢和环绕
  • 除以零
  • 死代码
  • 数据竞争、死锁和其他并发冲突

控制和数据流分析是一项高计算负载的任务,因为必须考虑系统的所有可能输入以及通过系统所有可能的控制流路径。事实上,由于控制流和数据流分析的蛮力穷举算法会导致分析时间指数暴涨,因此很少采用该方案。符号执行和抽象解释算法将是一个更好的选择。

根据Roberto Amadini、Graeme Gange、Peter Schachte、Harald Søndergaard 和Peter J. Stuckey的《抽象解释、符号执行和约束》,“抽象解释是一个静态代码分析框架,对程序所有可能运行时状态适用过近似。”

而“符号执行是可达性分析的框架,它试图探索程序所有可能的执行路径。”抽象解释和符号执行在执行期间都以不变量或路径条件的形式保持约束,这些路径约束决定了可以执行何种可能路径以及可以在各种数据源中保存哪些值。

但需要注意的一点是,虽然抽象解释较为全面,但符号执行却未全面执行。

为什么全面静态代码分析很重要?
 

全面性是安全关键软件系统中的一个重要因素,尤其是能够保证软件不存在任何正在检查的编码缺陷。也就是说,全面分析可用于确保软件中不存在错误。

基于此,在汽车系统的ISO 26262功能安全(FuSa)标准中,抽象解释分析被明确引用为软件单元验证方法(表7,方法1i)。

如何使用Helix QAC工具执行全面静态代码分析
 

由于能够提供深入和高度准确的分析结果,30多年以来,Helix QAC一直是值得信赖的静态代码分析工具。Helix QAC能够进行全面的静态分析,一直是符合合规性的严格监管和安全关键行业的首选工具。

但为了能在Helix QAC工具中启用全面分析,需要执行以下步骤:

需要将数据流深度(Dataflow Settings)设置为最大值 (5),这将添加多个 -prodoption,如上面的屏幕截图所示。(请参阅 QAC 或 QAC++ 组件手册中的"分析超时"一节,了解为什么该类"超时"设置对于全面分析是必需的。)

此外,“df::inter=5”和“inter-TU Analysis”虽然不是全面分析所必需的,但可以以额外的计算成本启用,以减少可能需要报告的问题数量。这些设置可用于启用程序间和程序内分析。

为什么使用Helix QAC工具进行全面静态分析
 

亲自体验Helix QAC工具的全面静态分析对代码质量和全面性的影响。

立即联系 龙智 体验,开启您的Helix QAC免费试用之旅。

作者简介:
 

史蒂夫·霍华德(Steve Howard)

静态代码扫描工具(SAST)Perforce系统产品倡导者, 史蒂夫在软件验证和确认领域拥有超过15年的经验,尤其是在静态代码分析方面经验颇丰。

史蒂夫拥有威尔士大学计算机科学一等学位和多个软件测试和安全认证的研究生学历。

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

一文了解全面静态代码分析 的相关文章

  • 什么是 gitlab runner

    我想我从根本上错过了一些东西 我是 CI CD 新手 正在尝试使用 gitlab 建立我的第一个管道 该项目是一个预先存在的 PHP 项目 我还不想清理它 目前我已经将整个东西推入了 docker 容器 并且它与谷歌云的 mysql 数据库
  • 在 Chef 中使用属性

    刚刚开始使用chef最近 我发现属性存储在一个名为的大型整体哈希中node可在您的食谱和模板中使用 似乎有多种定义属性的方法 直接在食谱本身中 在属性文件下 例如attributes default rb 在传递给的 JSON 对象中che
  • 无法终止容器::尝试终止容器,但未收到退出事件

    我无法停止 删除或终止我的 docker 容器 下面给出的命令及其各自的错误消息 1 docker stop
  • “幽灵”kubernetes pod 陷入终止状态

    情况 我有一个 kubernetes pod 处于 终止 状态 无法删除 pod NAME READY STATUS RESTARTS AGE funny turtle myservice xxx yyy 1 1 Terminating 1
  • 如何防止 BOM 从 Perforce unicode 文件中删除

    我已将带有 NET 和 SQL 源的整个分支转换为带 BOM 的 UTF 8 将其 Perforce 文件类型更改为Unicode在同一操作中 编码差异可能听起来令人困惑 但在 Perforce 中 Unicode文件类型表示UTF 8文件
  • 如何使用jenkins管道将war部署到tomcat?

    我想使用管道部署 war 文件 正确的做法是什么 有没有办法在管道代码中使用部署到容器 调用catalina sh或使用curl命令使用jenkins管理器进行部署的问题是我找不到任何方法来检测成功的部署 有没有标准的方法可以做到这一点 在
  • 具有 Spring Boot 应用程序的 docker Secret 无法在 docker swarm 模式/run/secrets 下工作

    我正在尝试设置 MySQL 容器和 Spring Boot 应用程序的数据库密码的环境变量 该密码通常在 docker 秘密中声明 echo db secured password docker secret create secret 这
  • 如何配置 Beyond Compare 以忽略注释中的 SCM 替换文本?

    我确实有一些被 SCM 替换的文本序列 在我的例子中是 Perforce 我确实想配置 BeyondCompare 将这些序列视为不重要的差异 以便在比较文件时能够忽略它们 就我而言 它是关于 Python 源文件的 序列看起来像 Id d
  • 如何删除 Perforce 中的工作区(使用 p4v)?

    我是 Perforce 的新手 创建了一些工作区作为熟悉它的练习 现在我想删除一些工作区 我只想删除工作区 以便它们不会出现在工作区视图的下拉列表中 do not想要对实际的仓库文件执行任何操作 谷歌搜索答案会产生 使工作区处于活动状态 的
  • 我们如何在 Perforce 中识别父分支?

    假设我有一个主要分支 项目 主 然后我从主分支创建了新分支 项目 1 0 然后我再次从 1 0 创建了分支 项目 2 0 现在 如果有人想知道2 0分支是从哪个分支创建的 用户如何识别呢 选择一个文件并使用 Perforce 修订图查看特定
  • 如何查看 Perforce 中的分支是否包含错误修复?

    我是一个新的 perforce 用户 但过去使用过许多其他源代码控制系统 我们使用变更列表来签入每个错误修复 更改列表注释包含错误 ID 因此可以轻松跟踪错误修复的时间签入分店 但是 我看不到一种简单的方法来查找给定错误修复的所有分支并入
  • 将容器推送到 Azure 容器注册表时资源访问被拒绝

    使用 Docker Compose 将容器推送到私有 Azure 容器注册表时 Azure DevOps 管道返回以下错误 正在推送 容器 注册表 应用程序 最新 推送引用存储库 docker io registry container 被
  • Perforce Dev 分支 - 稀疏分支与私有分支

    我正在寻找一些关于可用于在 Perforce 仓库中创建单独开发分支的方法的优点和缺点的反馈 如果我理解正确的话 有两种方法可以处理这个问题 第一个是创建一个私有分支 它是您正在处理的分支的完整副本 该分支将完全独立 并将您的更改与目标分支
  • 从 Jenkinsfile 设置管道名称和描述

    我正在尝试将 jenkins 管道的 poc 作为代码 我正在使用 Github 组织文件夹插件来扫描 Github 组织并为每个分支创建作业 有没有办法显式定义从 Jenkinsfile 获取的管道作业的名称 我还想添加一些职位描述 你需
  • 如何在 Jenkins 控制台输出中隐藏 checkout scm 步骤输出

    我在 Jenkinsfile 脚本化管道 中的第一个阶段是 checkout scm 它简要描述了 GitHub checkouts 和所有修订相关的内容我不想在 Jenkins 控制台输出中显示 是否可以将其隐藏在 Jenkins 的控制
  • 将更改推送到 Cloud Foundry 时出错

    从我的本地主机 我连接到 blue mix cf api https api ng bluemix net 我登录然后用以下命令推送更改 cf push 然而 在控制台中 Uploading MY PROJECT Uploading app
  • 是否可以在具有高山风味的 docker 容器内构建 AOSP?

    我对 AOSP 非常陌生 我正在尝试在 Docker 上设置完整的 AOSP 以构建 Docker 映像 例如 Alpine 或 Ubuntu 映像 如果不可能 请让我知道无法在内部设置 AOSP 的原因泊坞窗图像 或者我需要编写 Dock
  • 错误:无法下载存储库“appstream”的元数据:无法准备内部镜像列表:镜像列表中没有 URL

    我正在尝试使用我在 Dockerfile 中指定的 centOs 上的 yum 下载 java 拉取 centOs 镜像后 运行崩溃并抛出此错误 还要提一下 我的服务器实例是AWS EC2 Step 2 9 RUN yum install
  • 如何避免开发人员将凭证推送到 bitbucket?

    我们有一个应用程序 它使用 JSON 文件来定义数据库和其他 API 的连接字符串和凭据 理想情况下 这些凭证作为变量添加到 bitbucket 存储库中 并在 Jenkins 的构建期间进行替换 开发商在当地与他们合作时更换了他们 我们需
  • Perforce Excel 文件差异

    我有一堆 excel 文件放在 perforce 上 我想对这些 excel 文件进行 diff 类似于我在 perforce 中对其他文件 如 java cs 等 所做的操作 我尝试寻找一个插件 发现 P4OFC 只适合对 word 文件

随机推荐

  • Java正则表达式详解

    1 1 正则表达式的概念以及演示 正则表达式可以用一些规定的字符来制定规则 并用来校验数据格式的合法性 正则表达式就是用来验证各种字符串的规则 它内部描述了一些规则 我们可以验证用户输入的字符串是否匹配这个规则 正则表达式是一种强大的校验机
  • 2023-8-23 堆排序

    题目链接 堆排序 include
  • python写程序计算无穷级数_[python][计算方法]利用无穷级数计算幂运算(开根号)...

    encoding gbk a的n次方函数 def exp a n ret 1 for i in range 0 n ret a return float ret n n 1 n 2 def getN minus n n x ret floa
  • 【教程】加速访问和下载github项目,原来替换一个域名就可以加速了

    目录 前言 gitee方法 更简便方法 使用教程 前言 大家平时下载github项目的时候 非常的慢 有时候浏览某个项目的md介绍时候 图片就是加载不出来 让人很苦恼 想锤电脑 gitee方法 于是有很多人都是用gitee的方法 先导入到g
  • 【存储管理】brk()系统调用

    尽管应用程序编程时很少直接调用brk 系统调用 但是它是最经常使用的系统调用 1 C语言中的malloc以及C 语言中的new都在间接的调用着brk 这个系统调用 内核中含有3GB的用户虚存空间 会部分映射到物理存储空间 用户程序经过编译
  • vue中怎么引入element以及使用的详细教程

    引入element 安装依赖 在使用 Element 之前 需要先安装 Element 的依赖库 可以使用 npm 或者 yarn 安装 npm npm i element ui S yarn yarn add element ui 引入C
  • Qt 如何关闭 Debug信息输出

    在pro文件中加上DEFINES QT NO DEBUG OUTPUT 然后重新构建一下程序 qDebug的信息就不再输出了 不过qWarning qCritical等信息仍然可以输出 类似的宏还有 QT NO INFO OUTPUT QT
  • 剑指Offer第五十八题:对称的二叉树

    题目描述 请实现一个函数 用来判断一颗二叉树是不是对称的 注意 如果一个二叉树同此二叉树的镜像是同样的 定义其为对称的 1 思路 我们通常有三种不同的二叉树遍历算法 即前序遍历 中序遍历和后序遍历 在这三种遍历算法中 都是先遍历左子结点再遍
  • 良许Linux

    Linux 服务器我们天天打交道 特别是 Linux 工程师更是如此 为了保证服务器的安全与性能 我们经常需要监控服务器的一些状态 以保证工作能顺利开展 本文介绍的几个命令 不仅仅适用于服务器监控 也适用于我们日常情况下的开发 1 watc
  • depcheck检测缺失哪些依赖包

    npm install g depcheck 如果不想全局安装 npm i depcheck后可以在package json的scripts中输入 check depcheck 之后使用 npm run check depcheck npm
  • umi-request 网络请求之路

    umi request 网络请求之路 背景 在做中台业务应用开发的过程中 我们发现在请求链路上存在以下问题 请求库各式各样 没有统一 每次新起应用都需要重复实现一套请求层逻辑 切换应用时需要重新学习请求库 API 各应用接口设计不一致 混乱
  • sql注入Less11-20

    Less 11 POST 1 先登录 在表格中输入admin admin 登录成功后为下图 2 在post data中输入以下 uname passwd 1 submit submit 返回的结果显示存在sql语法错误 证明存在注入漏洞 u
  • 修改别人代码的原则

    工作过程中难免会涉及到修改或维护别人写的代码 如 代码原作者请假 离职 或相关的bug落到了你的头上 或用别人写的通用方法不爽时 如果碰到修改别人的代码时 需要注意哪些事项呢 1 和原作者沟通 当用到了他人写的通用方法 又感觉不爽时 如果原
  • 各个版本chrome允许加载使用flash的方法

    根除办法 在html中嵌入标签 用户自动选择是否加载flash 69 0 之前的版本 1 打开 chrome settings content flash 2 禁止网站运行Flash gt 改为 Ask Default 3 允许 gt 添加
  • golang开发的准备 - gvm(go版本管理软件)的安装

    0 系统环境 ubuntu18 04 1 前置条件 sudo apt get install bison 2 安装步骤 1 从github下载安装包文件 git clone https github com moovweb gvm git
  • 【c++】14.编译proto和proto相关用法

    编译proto和proto相关用法 关于proto相关的知识可以参考系列博客 https blog csdn net daaikuaichuan category 9869251 html xx proto文件中如果要注释的话 注释符号也是
  • 【Kaggle】Stable Diffusion - Image to Prompts竞赛代码初步理解

    文章目录 一 前言 二 导包 三 加载预训练的 OFA 模型 四 模型EDA 五 Inference 六 安装并导入所有依赖项 七 设置配置 八 加载示例提交 九 Build index from images 十 CLIP interro
  • grep命令

    grep 全称是global regular expressions print 功能就是查找匹配模式的行 grep对文本内容的处理是以行为单位 输出也是输出匹配的行 也可以使用两个变种程序egrep和fgrep egrep与grep E相
  • linux下绑定任务到特定的CPU

    一 linux c查看cpu核 1 命令行查看cpu有几个核 cat proc cpuinfo grep processor wc l 或 nproc 2 linux c代码查看 include
  • 一文了解全面静态代码分析

    在开发具有安全性 可靠性和合规性的软件时 全面静态代码分析是一种有效的方法 在这里 我们将就静态分析而言 讨论全面静态代码分析的不同之处 阐述全面静态代码分析的重要性 以及如何进行全面静态代码分析 什么是全面静态代码分析 全面静态代码分析