程序分析

计算机科学中,程序分析是自动分析计算机程序在正确性,鲁棒性,安全性和livese等属性的行为的过程。程序分析侧重于两个主要领域:程序优化程序正确性。第一个重点是改善程序的性能,同时减少资源使用情况,而后者则侧重于确保该程序可以完成该计划。

可以在不执行程序(静态程序分析),运行时(动态程序分析)或两者组合的情况下执行程序分析(静态程序分析)。

静态程序分析

在程序正确性的背景下,静态分析可以在程序的开发阶段发现漏洞。这些漏洞比在测试阶段发现的漏洞更容易纠正,因为静态分析导致漏洞的根源。

由于多种形式的静态分析在计算上是不可决定的,因此这样做的机制并不总是以正确的答案终止- 要幺是因为它们有时会返回错误的负面(当代码确实确实存在问题时,“找不到问题”)或假阳性,或者因为他们永远不会返回错误的答案,但有时永远不会终止。尽管存在局限性,但第一种机制可能会减少脆弱性数量,而第二种机制有时可以强烈保证缺乏某种类别的漏洞。

不正确的优化是高度不良的。因此,在计划优化的背景下,有两种主要策略来处理计算上不可决定的分析:

  1. 预期在相对较短的时间内完成的优化器,例如优化编译器中的优化器,可以使用分析的截断版本,保证可以在有限的时间内完成,并保证只能找到正确优化。
  2. 第三方优化工具可以以永远不会产生错误的优化的方式实现,但在某些情况下,它可以无限期地运行直到找到一个(可能永远不会发生)。在这种情况下,使用该工具的开发人员必须停止工具,并避免再次在该代码上运行该工具(或可能修改代码以避免绊倒工具)。

但是,还有第三个策略有时适用于未完全指定的语言,例如c 。优化编译器是可以自由生成在运行时执行任何操作的代码,甚至崩溃 - 如果遇到其语言标准未指定的语义的源代码。

控制流

控制流分析的目的是获取有关执行程序期间可以在各个点调用哪些功能的信息。收集的信息由控制流图(CFG)表示,其中节点是程序的指令,边缘代表控制流。通过识别代码块和循环,CFG成为编译器制造优化的起点。

数据流分析

数据流分析是一种旨在收集有关程序每个点值以及它们如何随时间变化的信息。编译器通常使用此技术来优化代码。数据流分析的最著名示例之一是污染检查,它包括考虑所有包含用户供置数据的变量(即“受污染”,即不安全的数据),并防止使用这些变量直到使用这些变量消毒。该技术通常用于防止SQL注射攻击。可以在静态或动态上进行污染检查。

抽象解释

抽象的解释允许提取有关程序可能执行的信息,而无需实际执行程序。编译器可以使用此信息来寻找可能的优化或针对某些类别的错误认证程序。

类型系统

类型系统将类型关联到满足某些要求的程序。他们的目的是选择根据属性认为正确的语言程序的子集。

类型检查用于编程中,以限制编程对象的使用方式以及可以做什么。这是由编译器或解释器完成的。类型检查还可以通过确保签名值不归因于无符号变量来帮助防止漏洞。可以通过静态(在编译时),动态(在运行时)或两者组合进行静态检查。

静态类型信息(源代码中的类型注释推断,或通过类型注释明确提供)也可以用于进行优化,例如用未框的数组替换盒装数组

效应系统

效应系统是旨在表示执行函数或方法所具有的效果的正式系统。效果编码正在完成的工作以及所做的工作 - 通常称为效果效果区域

模型检查

模型检查是指严格,正式和自动化的方法来检查模型是否(在这种情况下意味着正式的代码模型,尽管在其他情况下可以是硬件的模型)符合给定规格。由于代码的固有有限状态,并且规范和代码可转换为逻辑公式,因此可以检查系统是否使用有效的算法方法违反规范。

动态程序分析

动态分析可以使用程序的运行时知识来提高分析的精度,同时还提供了运行时保护,但是它只能分析问题的单个执行,并且由于运行时检查而可能会降低程序的性能。

测试

应测试软件以确保其质量并按照应有的方式执行,并且它不会与其他可能与之相同的软件造成冲突。测试是通过使用输入执行程序并评估其行为和产生的输出来执行程序的。即使没有指定安全要求,也应执行其他安全性测试,以确保攻击者不能篡改软件并窃取信息,破坏软件的正常操作,或将其用作枢轴来攻击其用户。

监视

程序监视记录并记录有关该程序的各种信息,例如资源使用,事件和交互,以便可以审查以查找或查明异常行为的原因。此外,它可用于执行安全审核。对程序的自动监视有时称为运行时验证

程序切片

对于程序行为的给定子集,程序切片包括将程序简化为仍会产生所选行为的最低形式。简化的程序称为“切片”,是指定行为子集域内原始程序的忠实表示。通常,找到切片是一个无法解决的问题,但是通过通过一组变量的值指定目标行为子集,可以使用数据流算法获得近似切片。这些切片通常由开发人员在调试期间使用以定位错误源。

也可以看看