动态程序分析
动态程序分析是对计算机软件的分析,涉及执行所讨论的程序(而不是静态程序分析,而不是)。动态程序分析包括来自软件工程的熟悉技术,例如单元测试,调试和测量代码覆盖范围,但还包括较鲜为人知的技术,例如程序切片和不变推理。动态程序分析以运行时内存错误检测,模糊,动态符号执行和污点跟踪的形式广泛应用于安全性。
为了使动态程序分析有效,必须使用足够的测试输入来执行目标程序,以解决可能的输入和输出范围。软件测试措施(例如代码覆盖率)和突变测试等工具用于识别测试不足的情况。
为了动态分析,必须注意将仪器对目标程序的执行(包括时间属性)的影响最小化。单位测试,集成测试,系统测试和接受测试是动态测试的形式。
动态分析的类型
代码覆盖范围
根据测试套件或工作量计算代码覆盖范围是一种标准的动态分析技术。它标识了在测试中未执行代码的情况,即在“覆盖”的代码和未进行的代码之间进行区分。
这种分析形式确定了负面因素(未测试的代码),但没有识别阳性(它无法识别代码是否已得到充分测试,即使是具有“ 100%覆盖”的代码)。即使“测试”实际上没有测试该代码所做的内容,也可能导致代码由自动测试系统执行,从而导致“代码覆盖”。
动态测试
动态测试涉及在一组测试用例上执行程序。
内存错误检测
- addressSanitizer :Linux, MacOS ,Windows等的内存错误检测。 LLVM的一部分。
- BoundSchecker :基于Windows的应用程序的内存错误检测。 Micro Focus Devpartner的一部分。
- Dmalloc :用于检查内存分配和泄漏的库。必须重新编译软件,并且所有文件必须包括特殊的C标头文件Dmalloc.h。
- Intel Inspector :在Windows和Linux上运行的C,C ++和FORTRAN应用程序的动态内存错误调试器。
- 纯化:主要是内存损坏检测和内存泄漏检测。
- Valgrind :在虚拟处理器上运行程序,并可以检测内存错误(例如,滥用Malloc和Malloc和Free )以及多线程程序中的竞赛条件。
模糊
模糊是一种测试技术,涉及在各种输入上执行程序;这些输入通常是随机生成的(至少部分是部分)。灰色框爆炸器使用代码覆盖范围来指导输入生成。
动态符号执行
动态符号执行(也称为dse或concololic执行)涉及在混凝土输入上执行测试程序,收集与执行相关的路径约束,并使用约束求解器(通常是SMT求解器)生成新输入,以引起可能导致的新输入采用不同控制流路径的程序,从而增加了测试套件的代码覆盖率。 DSE可以考虑一种模糊(“白框”模糊)。
动态数据流分析
动态数据流分析跟踪信息从源到水槽的流动。动态数据流分析的形式包括动态污染分析甚至动态符号执行。
不变推理
Daikon是动态不变检测的实现。 Daikon运行一个程序,观察程序计算的值,然后报告在观察到的执行中为真实的属性,因此在所有执行中可能是正确的。
安全分析
动态分析可用于检测安全问题。
- IBM Rational AppScan是针对开发生命周期不同阶段的应用程序安全解决方案的套件。该套件包括两个主要动态分析产品:IBM Rational AppScan标准版和IBM Rational AppScan Enterprise Edition。此外,该套件还包括IBM Rational AppScan源版 - 静态分析工具。
并发错误
- Parasoft JTest使用运行时错误检测来暴露缺陷,例如种族条件,异常,资源和内存泄漏以及安全攻击漏洞。
- 英特尔Inspelor在Windows中执行运行时线程和内存错误分析。
- Parasoft保证++是运行时内存分析和错误检测工具。它的Inuse组件提供了随着时间的流逝的记忆分配的图形视图,并具有整体堆的特定可见性,块分配,可能的出色泄漏等。
- Google的线程消毒剂是一种数据竞赛检测工具。 IT仪器LLVM IR捕获racy内存访问。
程序切片
对于程序行为的给定子集,程序切片包括将程序简化为仍会产生所选行为的最低形式。简化的程序称为“切片”,是指定行为子集域内原始程序的忠实表示。通常,找到切片是一个无法解决的问题,但是通过通过一组变量的值指定目标行为子集,可以使用数据流算法获得近似切片。这些切片通常由开发人员在调试期间使用以定位错误源。
绩效分析
大多数性能分析工具都使用动态程序分析技术。
技术
大多数动态分析技术基于某种代码仪器或转换。
- DynInst是一个运行时代码绘制库,可用于开发动态程序分析探针并将其应用于编译可执行文件。 Dyninst通常不需要源代码或重新编译,但是,具有调试符号的未分解可执行文件和可执行文件更容易仪器。
- IROH.JS是JavaScript的运行时代码分析库。它可以跟踪代码执行路径,为运行时侦听器侦听特定的执行代码模式,并允许拦截和操纵程序的执行行为。