受制于覆盖计算精度、工程约减以及规则库、缺陷库,以基于形式化的静态分析工具验证非形式化软件,产生输出偏差在所难免,且理论上不可彻底消除。一个行之有效的方法就是构建静态分析融合平台,集成多种静态分析工具,不同工具并行分析,对静态分析结果进行融合,能够显著提高静态分析的准确性,降低错误漏报、误报及误判率。
静态分析融合旨在通过不同分析工具集成,分析数据融合,分析结果聚类,实现分析技术的集成化,分析过程的综合化,提高静态分析的准确性和可信性。图5-51构建了一个静态分析融合框架,为多工具集成及数据融合搭建了一个融合云端分析平台。
图5-51 静态分析融合框架
静态分析融合框架通过集成多种不同静态分析工具以及软件成分分析、性能测试、安全渗透测试等工具,在统一的平台上,驱动不同工具运行,同步实现测试,解析不同工具的检测结果,进行缺陷审计、数据同步和数据融合,剔除不一致及冗余数据,实现缺陷自动合并及报告导出,能够有效降低静态分析的错误漏报、误报及误判率。基于云化承载的静态分析融合平台如图5-52所示。
图5-52 基于云化承载的静态分析融合平台
静态分析工具具有坚实的理论基础,是软件测试领域发展最为成熟的自动化测试工具之一,但基于不同的开发语言,使用的技术、面向的对象、缺陷检测能力各异,种类繁多。这里,我们列举出部分常用静态分析工具,如表5-27所示。
表5-27 常用静态分析工具
在工程应用中,上表静态分析工具特别对那些程序规模不大、状态有限,同时对稳定性、可靠性要求很高的软件发挥了重要作用。但当程序复杂性过高且状态数过多时,则可能难以达到理想的效果。需要寻找更好的程序建模、遍历、约束条件求解方法。静态分析是动态测试的有力补充,实际工作中,需要将动态测试与静态分析结合起来,相互融合,发挥各自的优势,提高测试效率和测试质量。
LDRA Testbed、Klocwork、C++test、QAC等静态分析工具,支持代码规则定制以及检测结果文本形式浏览,以图表和报告实现代码的可视化测试,不仅能够检查代码的标准符合性,而且提高了代码测试的可视性和清晰度,其中C++test支持代码复审及在线回归。在此,基于静态规则分析、静态内存分析、代码质量度量能力等视角,对上述4款静态分析工具进行比较,如表5-28所示。
表5-28 典型静态分析工具比较
这4款静态分析工具所依据的规则并非完全一致,无法检出全部违规代码,测试结果之间互有补充又有诸多重合。事实上,其他静态分析工具亦然。比对测试结果与原始代码,可以发现由工具自动生成的测试报告具有以下特征:
(1)针对存在问题的同一行源码,不同工具的测试结果描述语言不同,各有风格。
(2)不同测试工具检测的同一问题代码,在各自测试结果中显示其路径及代码行数不同。由于工具在代码规则检查时具备更改代码格式的权限,导致测试报告中的问题代码行数与源码存在差异,但其差异一般不大于5。
(3)选定参考标准如国际标准、国家标准、行业标准,各工具测试报告中的问题描述与参考标准形成一一对应关系,上述测试工具生成英文报告,而国家标准和国家军用标准则均为汉字描述。
综上所述,相应分析工具自动生成的英文检测报告与汉语描述的参考标准之间仍未完全对应,面对规模庞大的代码,人工分析其测试报告在参考标准中的映射,时间和人力成本都随代码规模的扩张呈几何级数增长。因此,将工具生成的报告与参考标准建立准确的映射关系,成为提升最后一步工作效率的可行手段。
静态分析结果与标准之间的映射关系,被视为不同编程语言之间,对语义相近语句的分类。自然语言中,通常把一个词汇描述为向量,一条语句描述为一个矩阵,语义相近的语句之间,在语义空间上必然存在向量一致性。基于语义的跨语言文本聚类方法,解决了多种不同静态分析结果与规则集的映射问题。向量词频模型(Vector Term-Frequency Model,VTM)基于语料库实现跨语言文本聚类,使用Word2Vec模型完成“语句-向量”转换,实现文本分类,其由CBOW模型和Skip-gram模型构成,最早由Mikolov提出。Word2Vec模型数学表达如图5-53所示。
图5-53 Word2Vec模型数学表达
不同静态分析工具生成的测试报告,全部问题描述语句和规则集构成平行语料库,从有限语料库中提取文本分类信息,通过平行语料库完成语句分类,能够有效避免先翻译后将翻译结果进行分类所带来的计算问题。聚类过程处于语义和概念层面,更多地结合了自然语言的含义。CBOW模型由词的前后 m 个词汇出现的概率决定词 A 出现的概率
(5-10)
Skip-gram模型则是由上下文 n 个词汇预测词 A 出现的概率
(5-11)
Word2Vec是将词语划分为实数值向量表达的深度机器学习工具,在词向量训练中涵盖语料的上下文,从语义层面解决了跨语言文本分类主题漂变和语言隔离问题。
5.10.2.1 文本的向量表达
采用Word2Vec模型,将一段文本 S 描述为一组向量 ,向量存在一个几何中心,就如同该文本存在一个核心词一样。核心词定义为Core( S ) ,其归一化向量表达形式为
(5-12)
式(5-12)对文本中的核心词与非核心词未加区别,每个词汇的重要程度一致,这与实际情况不符。为此,在向量表达式中添加权重,对词汇在文本中的重要性加以区分
(5-13)
如式(5-13)所示,归一化向量表达式描述了文本 S 的几何中心,即该文本的向量表示。
5.10.2.2 基于加权词频的文本向量表示
采用词频−逆向文本频率(Term Frequency-Inverse Document Frequency,TF-IDF)确定式(5-13)中的词向量权重。TF-IDF是一种常用数据挖掘加权技术,是TF与IDF的乘积。TF表示目标词在文本中出现的频率,表示该词在文本中的重要程度;IDF用于度量目标词的普遍性,反映该词在文本中的识别度。假设语料库 D 中,存在一段包含 N 个词的文本,其中 k 个词不重复。对于一个词 ,其重要性 定义为
(5-14)
式中, 表示该词在文本中出现的次数; 表示文本中词的总数。
类似地,词 的IDF计算公式如下:
(5-15)
式中, 表示语料库中包含的全部文本个数; 表示语料库中包含词 的文本个数。为防止除数为零,在实际计算中,通常选择 作为分母。
根据式(5-14)和式(5-15)的计算结果,可以得到词 的TF-IDF计算表达式为
(5-16)
文本中,每个词的权重向量可表示为
(5-17)
在一段文本内,所有词的向量和是一个与路径无关的固定结果。因此,如下等式成立:
(5-18)
为了便于理解,将式(5-18)中的词频次数 替换为 m ,得到如下形式:
(5-19)
将上述结果代入式(5-13)中,得
(5-20)
由式(5-20)可知,在有限语料库场景下,基于词频的文本权重向量表达式与TF无关,仅需计算IDF即可得出一段文本的权重向量表达式。
5.10.2.3 相似性测度计算
文本向量距离采用欧氏距离或余弦距离。例如,用 和 表示两段文本的向量表达,两者之间的欧氏距离为
(5-21)
假设两个文本向量夹角为 C ,那么两者的余弦距离为
(5-22)
当两个文本向量模为1即 时,那么
(5-23)
当两个文本相似性测度大于设定阈值时,判定为语义相近。至此完成跨语言的文本聚类。
为讨论方便,特建立图5-54所示基于语义的检测结果与规则集聚类流程。
图5-54 基于语义的检测结果与规则集聚类流程
建立如下包含检测结果与规则集的平行语料库。
运行如下代码,完成文本向量表达和文本向量距离计算。
这里,选取如下5条进行检测。
第一条:'nAndFC.fc' is used uninitialized in this function.
第二条:Double freeing of freed memory may be in class c_menu_abount.
第三条:Pointer 'temp' returned from call to function 'malloc' at line 541 may be NULL and may be dereferenced at line 546.
第四条:'den' might be used uninitialized in this function.
第五条:Variable 'pr' was never read after being assigned.
每一列对应计算该检测结果与规则集之间的相似性测度值,对于成功匹配的两条文本相似性计算结果予以填充标明。
两条文本语义上接近的相似性测度值更大,与无关文本相似性测度则存在着明显的分离性,可以通过合理的相似性测度阈值加以区分。表5-29给出了检测结果与规则集相似性计算结果。
表5-29 检测结果与规则集相似性计算结果
上述方法实现了测试报告与规则集之间的映射,但未实现不同工具检测结果的融合,不同检测结果之间仍然存在重合与互补。检测结果自身携带问题代码路径Path以及所在函数中行数Line可区分问题代码。类似地,规则集的常见形式是“编号ID+规则描述”,编号即一个规则在其集合中的唯一识别。
规则描述与检测结果完成映射,意味着“Path+Line”与“规则ID”之间建立映射。问题代码路径与规则标识的关系如图5-55所示。
图5-55 问题代码路径与规则标识的关系
根据测试实践,给出问题与规则之间的关系。对于近似行代码,对应单规则ID情况,判定为重复检测,任选其一作为最终结果;单行代码对应多个规则ID情况判定为结果互补,保留不重复ID规则。至此,完成多工具检测结果与规则集合的融合匹配。