0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

高级静态分析符合基于合约的编程

星星科技指导员 来源:嵌入式计算设计 作者:S. Tucker Taft 2022-07-04 15:14 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

高级静态分析工具正在成为许多专业程序员工具包的标准部分。同时,越来越重视基于契约的编程,其中明确的前置条件、后置条件和其他契约被添加到源代码中,以帮助增强软件安全性和安全性,因为嵌入式系统变得越来越复杂和相互依赖。当这两种趋势相遇时,就会出现一些有趣的机会。特别是,某些高级静态分析工具开始直接识别合约,有些甚至通过从现有代码中推断出合约来帮助程序员创建合约。对高级静态分析的回顾有助于为讨论基于契约的编程奠定基础。

回顾高级静态分析

较新的静态分析工具不再简单地执行编码指南,而是深入研究程序结构的语义,有效地模拟运行时可能发生的情况,以检测逻辑不一致或安全漏洞。这些工具通常基于编译器技术,使用高级数据流分析来确定程序可能出错的地方,方法是跟踪变量在运行时可能具有的值,然后检查这些值是否都被程序正确处理以及是否可能被污染数据在被信任之前经过适当的审查。在代码实际上安全可靠但工具的价值跟踪或污点跟踪不够精确的地方,此类工具仍然存在产生误报(实际上是误报)的挑战。尽管如此,

图 1 说明了静态分析器如何使用数据流分析来跟踪变量(例如Count )的可能值,并确定这些值中的任何一个是否可能在以后的某个时间点导致问题。正在显示表格的值,然后是平均值。这里的经典“错误”是忽略表为空的可能性,从而导致可能的被零除错误。

图 1:高级流量分析示例

pYYBAGLCk6WAGpr-AAEIc1seP6I082.png

在这个例子中,为了避免被零除,程序员已经包含了一个表有至少一个元素的断言(即“ Table‘Length 》= 1) ”。但是,需要进行一些数据流分析来验证Float(Count)在除法“ Sum / Float(Count) ”中是否非零。这需要静态分析器将Float(Count)的值链接到Count的值,将Count的最终值链接到由Table’Range确定的循环迭代次数,并将该数字链接到Table‘Length(X’Range 表示“X‘First 。. X’Last”,而 X‘Length 表示“(如果 X’First 》 X‘Last then 0 else X’Last – X‘First + 1)”)。对程序员来说容易的事情可以为静态分析器做更多的工作。

那么静态分析器对“ pragma Assert(Table’Length 》= 1) ”做了什么?这就是分析器不同的地方,这取决于他们是采用自下而上还是自上而下的策略来发现跨越过程边界的错误,以及他们如何将这一点与基于合同的编程概念相结合。

基于合同的编程适合的地方

基于契约的编程(除其他外)是使用前置条件和后置条件来表达对组成程序的功能和过程(即子程序)的输入和输出(分别)的期望。

在图 1 的示例中,程序员的意图显然是“ Table‘Length 》= 1 ”作为该过程的先决条件。不幸的是,这个Assert隐藏在过程的代码中,而不是很容易被调用者看到。在 Eiffel[1] 或 Ada 2012[2] 等语言中,前置条件和后置条件是语法的一部分,或者在 C#Java 等语言中使用 Spec#[3] 或 Java 建模语言 (JML)[4] 等扩展,程序员对Display_Table过程的表输入的意图可以使用显式前置条件来表达。例如,在 Ada 2012 中,此过程的规范可以写成:

过程 Display_Table(Table: Float_Array) 与 Pre =》 Table’Length 》= 1;

这为Display_Table过程指定了方面Pre(“前提条件”的缩写),因此它对调用者可见并有效地成为Display_Table上的合同,这表明只要Table的长度至少为 1,Display_Table就可以执行它的正确工作。

静态分析:检查和推断合约

现在回到图 1 中的 pragma Assert。如果没有明确的合同要求调用者确保Table‘Length 》= 1,静态分析器可能会正确地抱怨,因为没有什么可以阻止调用者传入零长度表。但是,许多静态分析器使用不同的策略。他们不是立即抱怨Assert,而是依靠更多的全局检查来确定是否存在真正的问题,并且仅在有一个通过零长度表的调用时才抱怨。如前所述,这些全局的、过程间的检查可以主要是自下而上的,也可以主要是自上而下的,如图 2 所示。

图 2:自上而下与自下而上的过程间静态分析

pYYBAGLCk62ALByrAAK3oQspQWI417.png

在自上而下的策略中,分析器从程序的入口点向下走,在每次调用时用实际参数代替形式,直到识别出每个子程序的每次调用,累积一组可能的实际值传入对于每个正式的。然后使用该值集来确定是否可能通过某些特定的调用链违反Assert 。

在自下而上的策略中,分析从程序的叶子(不进行调用的子程序)开始,分析每个子程序以确定它对其输入施加的要求。在此示例中,Assert(Table’Length 》= 1)被有效地转换为过程的隐式前提条件。静态分析器本质上是在为每个子程序推断未声明的合约,然后将其传播到每个调用点,其中前提条件成为调用点实际参数的隐式断言。这个过程一直持续到更高级别的子程序,直到最终整个程序都被分析完。

随着程序变得越来越大,自下而上的方法可以比自上而下的方法更好地扩展,但它取决于推断潜在的复杂合同,包括条件先决条件,其中一个输入的先决条件可能取决于另一个输入的值。例如,对于以“ if X 》 0 then Assert(Y 》 0) ”开头的过程,推断的前提条件应该是“ X 》 0 ==》 Y 》 0 ”。两种通过自下而上分析推断合约的高级静态分析工具是 AdaCore 的 CodePeer 工具,它分析 Ada 源代码,以及 Microsoft Research 的 Clousot 工具,它分析 .NET 程序。

随着明确的前置条件和后置条件开始出现在程序中,使用像 Ada 2012 这样的语言,这些合同和高级静态分析工具的功能之间出现了新的协同作用。显式契约可以简化程序间分析,因为程序员已经完成了艰苦的工作。该工具可以简单地检查显式前提条件,而不必在调用中传播。在子程序中,该工具可以使用前置条件作为可能输入值的精确描述,而无需猜测程序员的意图。

显式契约还可以帮助其他希望使用子程序的程序员,因为它们充当机器可检查的注释和直接嵌入代码中的低级需求。但它们只有在程序员编写它们时才有帮助。由于一些高级静态分析工具可以从源代码中推断出合约,它们可以提供自动将它们插入源代码。Clousot之类的工具允许程序员“祝福”推断的合约,使其成为源代码的永久部分。

未来:一边编程一边证明

静态分析和基于合同的编程之间的协同作用可能允许更快地采用这两种技术。随着这两者的集成,一种新的编程方法可能会出现,程序员的助手会在创建源代码时帮助推断和检查合同。随着程序的编写,安全性得到了证明,就像文本编辑器中的拼写检查器可以确保不会出现拼写错误的单词一样。随着这些技术的成熟,我们可以希望不安全、不安全的程序将不再是常态,而是从一开始就内置安全性和安全性,并附带代码的机器可检查、人类可读的合约。书面。CodePeer和 Clousot等工具展示了一些可能性。

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5188

    文章

    20181

    浏览量

    329315
  • 源代码
    +关注

    关注

    96

    文章

    2953

    浏览量

    69714
  • 编译器
    +关注

    关注

    1

    文章

    1670

    浏览量

    51117
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    经营数据分析可以通过哪些方式

    在数聚股份看来,提起经营数据分析,大家往往会联想到一些密密麻麻的数字表格,或是高级的数据建模手法,再或是华丽的数据报表。其实,“ 分析 ”本身是每个人都具备的能力,对于业务决策者而言,则需要掌握一套
    的头像 发表于 12-05 16:31 401次阅读

    一文了解Mojo编程语言

    CPU、GPU 和其他加速器的支持,简化了并行编程模型。 渐进式类型系统 结合静态类型检查和类型推导,既保证编译时安全性,又保留动态类型的灵活性。 应用场景 AI 与机器学习 用于训练大型模型和实时推理
    发表于 11-07 05:59

    什么是CVE?如何通过SAST/静态分析工具Perforce QAC 和 Klocwork应对CVE?

    本文将为您详解什么是CVE、CVE标识符的作用,厘清CVE与CWE、CVSS的区别,介绍CVE清单内容,并说明如何借助合适的静态分析工具(如Perforce QAC/Klocwork),在软件开发早期发现并修复漏洞。
    的头像 发表于 10-31 14:24 298次阅读
    什么是CVE?如何通过SAST/<b class='flag-5'>静态</b><b class='flag-5'>分析</b>工具Perforce QAC 和 Klocwork应对CVE?

    知识分享 | 使用MXAM进行AUTOSAR模型的静态分析:Embedded Coder与TargetLink模型

    知识分享在知识分享栏目中,我们会定期与读者分享来自MES模赛思的基于模型的软件开发相关Know-How干货,关注公众号,随时掌握基于模型的软件设计的技术知识。使用MXAM进行AUTOSAR模型的静态
    的头像 发表于 08-27 10:04 520次阅读
    知识分享 | 使用MXAM进行AUTOSAR模型的<b class='flag-5'>静态</b><b class='flag-5'>分析</b>:Embedded Coder与TargetLink模型

    汽车软件团队必看:基于静态代码分析工具Perforce QAC的ISO 26262合规实践

    ISO 26262合规指南,从ASIL分级到工具落地,手把手教你用静态代码分析(Perforce QAC)实现高效合规。
    的头像 发表于 08-07 17:33 898次阅读
    汽车软件团队必看:基于<b class='flag-5'>静态</b>代码<b class='flag-5'>分析</b>工具Perforce QAC的ISO 26262合规实践

    协议分析仪支持哪些高级触发选项?

    协议分析仪支持多种高级触发选项,这些选项通过灵活组合协议字段、逻辑运算和时序控制,可实现复杂场景下的精准数据捕获,以下是具体分类与说明:一、基于协议字段的高级触发 精确匹配触发 功能:对特定协议
    发表于 07-23 14:21

    动态BGP与静态BGP的区别?

    的 IP,只要远端发起 BGP 握手,且来自 AS 65002,即自动建立对等关系。四、实战应用场景分析场景一:传统运营商边界路由器 使用静态 BGP BGP 对等关系固定,变化极少 需要手动管理
    发表于 06-24 06:57

    详解ADC电路的静态仿真和动态仿真

    ADC电路主要存在静态仿真和动态仿真两类仿真,针对两种不同的仿真,我们存在不同的输入信号和不同的数据采样,因此静态仿真和动态仿真是完全不同的两个概念,所以设置的参数不同。
    的头像 发表于 06-05 10:19 1579次阅读
    详解ADC电路的<b class='flag-5'>静态</b>仿真和动态仿真

    普源示波器高级触发功能案例分析

    触发功能(序列触发、逻辑触发、欠幅触发等)突破传统局限,为复杂信号分析提供强大工具。本文结合具体案例,解析这些高级功能在通信、电源管理、汽车电子等场景中的实际应用。   二、案例一:通信信号分析——序列触发精准定位协议异常 应用
    的头像 发表于 05-29 09:36 446次阅读

    如果 PD 合约不匹配,BCR 是否仍会打开 SINK_FET_EN POWER_DRILL2GO路径?

    BCR 具有 SINK_FET_EN 和 SAFE_PWR_EN 引脚来控制POWER_DRILL2GO消耗路径。 如果 PD 合约不匹配,BCR 是否仍会打开 SINK_FET_EN POWER_DRILL2GO路径?或者只打开 SAFE_PWR_EN POWER_DRILL2GO路径?
    发表于 05-23 08:01

    集成电路设计中静态时序分析介绍

    Analysis,STA)是集成电路设计中的一项关键技术,它通过分析电路中的时序关系来验证电路是否满足设计的时序要求。与动态仿真不同,STA不需要模拟电路的实际运行过程,而是通过分析电路中的各个时钟路径、信号传播延迟等信息来评估设计是否
    的头像 发表于 02-19 09:46 1347次阅读

    高级的阻抗计算和应用

    一般的阻抗计算公式适用于简单的电路结构,但在复杂的电路中以及频率响应非常重要的情况下,就需要更高级的阻抗计算了。这包括使用数值分析和方针工具。
    的头像 发表于 02-12 13:45 1049次阅读
    <b class='flag-5'>高级</b>的阻抗计算和应用

    ADC的静态指标有专用的分析工具吗?

    请问:ADC的静态指标有专用的分析工具吗?该指标很少在评估ADC指标时使用,是否该指标不重要,应用中什么情况下需要评估该指标? 另外ADC的SNR = 6.02*N + 1.76 +10*log10(fs/2BW) 当被采样信号为单音时 该BW为多少?
    发表于 02-08 08:13

    WEBENCH电源高级分析

    电子发烧友网站提供《WEBENCH电源高级分析.pdf》资料免费下载
    发表于 01-21 14:53 0次下载
    WEBENCH电源<b class='flag-5'>高级</b><b class='flag-5'>分析</b>

    gitee 支持的编程语言有哪些

    Gitee 支持的常见编程语言: Python :一种广泛使用的高级编程语言,以其清晰的语法和代码可读性而闻名。 Java :一种面向对象的编程语言,被广泛用于企业级应用开发。 C+
    的头像 发表于 01-06 09:50 1125次阅读