程序分析

✍ dations ◷ 2025-11-24 15:52:43 #程序分析

在计算机科学中,程序分析是指自动分析一个程序的包括正确性、健壮性、安全性和活跃性等特征的过程。程序分析主要研究两大领域:程序的优化(英语:Program optimization)和程序的正确性。前者研究如何提升程序性能并且降低程序的资源占用,后者研究如何确保程序完成预期的任务。

程序分析可以在不执行程序的情况下进行(静态程序分析),也可在执行时进行(动态程序分析(英语:Dynamic program analysis)),或结合二者。

在程序正确性里,静态分析可以在程序的开发阶段就发现漏洞。这些漏洞通常比测试阶段发现的漏洞更容易修复,因为静态分析可以直接发现漏洞的根源。

由于很多静态分析其实无法确切地判定,因此实现静态分析的机制不总返回正确的结果——要么是返回了一个假阴性(返回“没有发现问题”然而程序其实存在问题)或者是返回了一个假阳性,要么它们不返回错误的结果但是有时候不会终止。尽管它们或多或少地存在种种不足,然而前者可能帮助降低漏洞的数量,而后者则在一些时候可以明确确定程序不受某类漏洞的威胁。

不正确的优化是谁都不希望的,所以在程序优化里,有两类策略来处理无法判定的分析情况:

然而,还有第三种策略有时可以用于一些规范不够完整的语言(比如C语言)。一个做优化的编译器在遇到未定义行为时,可以自主选择如何生成这部分代码。生成的代码可以在运行时做任何事情,甚至可以崩溃。

控制流分析的目的是获取在程序执行时一些特定位置可能调用的函数的信息。这些信息由一张控制流图(英语:control flow graph)(英语:control flow graph,简称CFG)来表示,其中节点表示程序的指令,边表示控制流。通过识别代码块和循环,CFG常常被编译器当作优化的起始点。

数据流分析收集程序运行到不同位置时各个值的信息和它们随时间变化的信息。这一技巧也常被编译器用来优化代码。一个有名的数据流分析的例子叫做污点检验,它考虑所有的可能被使用者修改的变量(也就是有“污点”、不安全的变量),并阻止这些变量在被“消毒”前被使用。这一技巧常被用来避免SQL注入攻击。污点检验既可以静态完成也可以动态完成。

抽象释义允许在不执行程序时提取出某个可能的执行的信息。这个信息可以让编译器寻找某条可行的优化路径,也可以证明一个程序不会存在某些问题。

类型系统给程序关联上满足特定条件的类型。类型系统的目的是选出一个编程语言编写的程序的一个子集,使这个子集满足特定的性质。

类型检查被用来限制程序中一个对象如何被使用以及一个对象能做什么。类型检查是由编译器或解释器完成的。类型检查也可以帮助避免如将有符号变量赋值给无符号变量所带来的漏洞。类型检查可以静态完成(在编译期间),也可以动态完成(在运行时),或者结合二者。

静态类型信息(可以通过类型推论,或者由代码明确给出)也可以被用来做优化,例如把封包的数组替换为未封包的数组。

作用系统(英语:Effect systems)是一类用来给出函数或方法的作用的形式化系统。一个作用(英文:effect)规定了做了什么以及对谁做了——通常称之为作用类型(英文:effect kind)以及作用范围(英文:region)。

模型检查(英语:Model checking)指一类严格、形式化并且自动的检查一个(在这里指一段代码的形式化模型,但在其他语境下也可以指一个硬件的模型)是否符合给定规范的方法。基于代码内在状态有限这一特点,且规范和代码都可以被转换为逻辑公式,我们有能力用算法来检查一个系统是否违反规范。

动态程序分析(英语:Dynamic program analysis)可以用程序运行时的信息来提高分析的精度并且提供运行时保护,然而它只能分析单次运行的情况,并且可能因为进行运行时检查而降低运行性能。

每个软件都应当被测试来确保其质量,保证其按照期望稳定运行,并且确保其不会与其他软件冲突。测试一般通过运行程序并给定一组输入然后来评估程序给出的输出。即使软件没有指定好的安全性要求,也应当对其进行额外的安全性测试(英语:security testing)从而保证攻击者无法随意修改软件并盗取数据、妨碍软件的正常工作或者用它当作攻击其他用户的跳板。

程序监控会记录程序的诸多信息(例如资源占用、事件、交互等),使之可以在之后被用来寻找或定位异常行为的原因。此外,它还可以被用来做安全审查。程序的自动监控有时也被称为运行时检查(英语:runtime verification)。

对于一个给定的程序的行为的子集,程序切片(英语:program slicing)将程序削减到保持给定行为的最小形式。被削减后的程序被称之为一个“切片”,是原程序在给定行为子集上的一个正确表示。通常而言,找到切片是一个无法解决的问题。但是通过给定一组变量的值的行为的子集,有可能通过数据流算法来找到大约符合条件的切片。这些切片通常被开发者用来调试从而找到错误的原因。

相关

  • 伊比库斯伊比库斯(英语:Ibycus),约活动于公元前6世纪前后。古希腊诗人之一,为赫雷基乌姆的抒情诗人。效劳于萨摩斯的波吕克拉泰斯的宫廷。他的作品最初集为七卷本,主要是合唱歌曲、颂词和
  • 对苯二甲酸对苯二甲酸是苯二甲酸异构体中的一个,两个羧基处于苯环的对位,化学式为p-C6H4(COOH)2。对苯二甲酸是生产聚酯,尤其是聚对苯二甲酸乙二酯(PET)的原料。对苯二甲酸难溶于水、醇和醚
  • Ag银(原子量:107.8682(2))共有74个同位素,其中有2个同位素是稳定的。备注:画上#号的数据代表没有经过实验的证明,只是理论推测而已,而用括号括起来的代表数据不确定性。
  • L-门冬酰胺酶门冬酰胺酶(英语:Asparaginase,EC 3.5.1.1),又名天冬酰胺酶或天门冬酰胺酶,是一种催化天冬酰胺水解成天冬氨酸的酶。在自然界中,一些微生物能产生这种酶。不同类型的门冬酰胺酶被用
  • 澳大利亚财政部澳大利亚财政部长(英语:Treasurer of Australia)是澳大利亚政府的内阁部长官职。财政部长主管政府支出和收入,对政府的经济政策起重要的作用。财政部长是澳大利亚财政部(英语:Depa
  • 膜攻击复合物膜攻击复合物(MAC),是一种通常生成于致病细菌表面的结构。人体补体系统的替代补体途径、经典补体途径、凝集素途径均可产生这种复合物。该复合物是免疫系统的效应蛋白之一,它可
  • 神经振荡神经振荡是中枢神经系统中存在的一种节律性,或是重复性的神经元活动。神经组织可以通过多种方式产生振荡,这种振荡主要是靠单个神经元或者神经元之间的相互作用引发。在单个神
  • 四角化菱形三十面体在几何学中,四角化菱形三十面体是卡塔兰立体的一种,它的对偶多面体是大斜方截半二十面体。虽然他每个面都全等,但是皆为不规则的多边形,严格来说是直角三角形,也可以看做是对折的
  • 加布里埃尔·李普曼加布里埃尔·李普曼(法语:Gabriel Lippmann,1845年8月16日-1921年7月13日),法国知名物理学家,他因为发明制作彩色玻璃照相技术,于1908年获得诺贝尔物理学奖。除此之外,他亦对物理波长
  • 美国地方行政长官列表美国地方行政长官列表是如今在美国各州和属地担任州长或者总督(属地的行政长官通常称总督),以及在华盛顿哥伦比亚特区担任市长的人士列表。在各州之中,有26位州长来自共和党,24位