对于C/C++软件而言,静态测试越来越趋向软件安全功能测试。包括数据机密性、完整性、可用性、不可否认性、身份认证、授权、访问控制、审计跟踪、委托、隐私保护、安全管理等。
通常情况下,C/C++静态测试是把程序源代码变换成易于分析处理的程序模型。有4个分析模型:
● 词法分析:使用正则表达式匹配将源代码转换为等价的符号流。
● 语法分析:使用上下文无关语法将符号流规整为语法树,作为源代码逻辑结构的最直接的表现。
● 抽象语法分析:通过简化语法将语法树转换为包含更少节点和分支的抽象语法树,以方便后续处理。
● 语义分析:从抽象语法树建立符号表,为每个标识符关联类型信息。至此,已经具备了足够的信息来进行所谓的结构化分析。编译器通常将抽象语法树和符号表 转化 成易于优化的中间形式,然后送给后端生成平台相关的目标代码。安全分析工具可以建立更高阶的中间形式,或者直接在抽象语法树和符号表上进行后续步 骤。
在分析模型建立后,就可以开始进行静态测试。静态测试直接分析被测程序特征,寻找可能导致错误的异常。
C/C++静态测试技术目前的发展趋势是将静态测试的各种技术进行结合,以提高性能。结合方式有以下方法:
● 提供一个框架,使用不同检测技术对程序进行检测,获取大量检测结果之后进行分析。从误报率来说,使用多种技术的检测结果的交集来进行漏洞判断决策,可减少误报率。从漏报率来说,对于同一种漏洞,使用多种检测技术的结果的并集可以减少漏报率。
● 直接在检测技术上结合,通过技术的结合来得到新的方法,如在符号执行的过程中加入类型推导的技术,在变量模拟执行的过程中增加其类型特征的推导,可获取更高的漏洞检测率。