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

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

3天内不再提示

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

星星科技指导员 来源:嵌入式计算设计 作者:S. Tucker Taft 2022-06-19 07:17 次阅读

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

回顾高级静态分析

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

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

图 1:高级流量分析示例

pYYBAGKsRrqAd3DpAAFL9B4PYlM162.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:自上而下与自下而上的过程间静态分析

pYYBAGKsRsOAHUC9AAMz89Vi3NM942.png

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

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

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

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

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

未来:一边编程一边证明

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

审核编辑:郭婷

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

    关注

    19

    文章

    2904

    浏览量

    102989
  • 编译器
    +关注

    关注

    1

    文章

    1575

    浏览量

    48606
收藏 人收藏

    评论

    相关推荐

    C语言进阶之嵌入式系统高级C语言编程

    电子发烧友网站提供《C语言进阶之嵌入式系统高级C语言编程.rar》资料免费下载
    发表于 11-18 10:32 1次下载
    C语言进阶之嵌入式系统<b class='flag-5'>高级</b>C语言<b class='flag-5'>编程</b>

    什么是静态?收音机放大电路的静态分析指标是什么?

    未加信号时三极管的直流工作状态被称为静态,也可以说成放大电路没有输入信号时的工作状态,放大电路的质量与静态值的关系很大。
    的头像 发表于 09-27 16:46 1614次阅读
    什么是<b class='flag-5'>静态</b>?收音机放大电路的<b class='flag-5'>静态</b><b class='flag-5'>分析</b>指标是什么?

    LabVIEW高级编程—多通道数据采集

    LabVIEW高级编程——多通道数据采集
    发表于 09-20 06:12

    PrimeCell静态存储器控制器(PL092)技术参考手册

    PrimeCell静态存储器控制器(SMC)是一款符合高级微控制器总线架构(AMBA)的片上系统(SoC)外围设备,由ARM有限公司开发、测试和许可。 SMC是一个AMBA从模块,连接到高级
    发表于 08-02 12:21

    嵌入软件静态解析工具

    CasePlayer2 : 适用于嵌入式软件的说明书制作及解析工具 静态解析C/C++源代码自动生成流程图等文件适用于各种嵌入式微机用汇编代码具有符合编程标准MISRA-C1998/2004的规范
    发表于 08-02 11:51

    什么是静态代码分析静态代码分析概述

    静态分析可帮助面临压力的开发团队。高质量的版本需要按时交付。需要满足编码和合规性标准。错误不是一种选择。 这就是开发团队使用静态分析工具/源代码分析
    的头像 发表于 07-19 12:09 920次阅读
    什么是<b class='flag-5'>静态</b>代码<b class='flag-5'>分析</b>?<b class='flag-5'>静态</b>代码<b class='flag-5'>分析</b>概述

    静态时序分析的相关概念

      本文主要介绍了静态时序分析 STA。
    的头像 发表于 07-04 14:40 588次阅读
    <b class='flag-5'>静态</b>时序<b class='flag-5'>分析</b>的相关概念

    数码管的静态、动态显示原理及编程方法(2)

    “掌握数码管的静态、动态显示原理及编程方法。--综合案例”
    的头像 发表于 06-28 11:41 1000次阅读
    数码管的<b class='flag-5'>静态</b>、动态显示原理及<b class='flag-5'>编程</b>方法(2)

    数码管的静态、动态显示原理及编程方法(1)

    “掌握数码管的静态、动态显示原理及编程方法。--不是综合案例”
    的头像 发表于 06-28 11:40 952次阅读
    数码管的<b class='flag-5'>静态</b>、动态显示原理及<b class='flag-5'>编程</b>方法(1)

    静态时序分析的基本概念和方法

    引言 在同步电路设计中,时序是一个非常重要的因素,它决定了电路能否以预期的时钟速率运行。为了验证电路的时序性能,我们需要进行 静态时序分析 ,即 在最坏情况下检查所有可能的时序违规路径,而不需要测试
    的头像 发表于 06-28 09:38 797次阅读
    <b class='flag-5'>静态</b>时序<b class='flag-5'>分析</b>的基本概念和方法

    STA-0.静态时序分析概述

    静态时序分析(Static Timing Analysis, 以下统一简称 **STA** )是验证数字集成电路时序是否合格的一种方法,其中需要进行大量的数字计算,需要依靠工具进行,但是我们必须了解其中的原理。
    的头像 发表于 06-27 11:43 571次阅读
    STA-0.<b class='flag-5'>静态</b>时序<b class='flag-5'>分析</b>概述

    基于PASCAL的高级编程语言——SCL编程语言

    根据该标准,可对用于可编程逻辑控制器的编程语言进行标准化。SCL 编程语言实现了该标准中定义的 ST 语言 (结构化文本) 的 PLCopen 初级水平。
    发表于 06-20 10:20 1057次阅读
    基于PASCAL的<b class='flag-5'>高级</b><b class='flag-5'>编程</b>语言——SCL<b class='flag-5'>编程</b>语言

    恒讯科技分析静态ip是什么意思?有什么优缺点?

    静态ip是什么意思?“静态”一词的意思是不变的,这很好地描述了静态ip地址的工作原理。静态ip的含义是指分配给设备并保持不变的ip地址,而不是每次设备连接到Internet时都会更改的
    的头像 发表于 06-01 16:57 1193次阅读

    FPGA静态时序分析简单解读

    任何学FPGA的人都跑不掉的一个问题就是进行静态时序分析静态时序分析的公式,老实说很晦涩,而且总能看到不同的版本,内容又不那么一致,为了彻底解决这个问题,我研究了一天,终于找到了一种
    的头像 发表于 05-29 10:24 370次阅读
    FPGA<b class='flag-5'>静态</b>时序<b class='flag-5'>分析</b>简单解读

    静态分析和动态分析的区别

    静态分析和动态分析是一种双管齐下的方法,可以在可靠性、错误检测、效率和安全性方面改进开发过程。为什么它们都很重要?它们又有什么区别呢?
    的头像 发表于 05-16 16:03 3980次阅读