译者 | CQT&暗星云项目组
一、大背景
标识符级产品质量控制技术:简而言之为了服务产品质量更快,牵涉到标识符微观的相关控制技术,特别要指出的是,标识符级产品质量控制技术不纯粹指标识符停售控制技术,如静态标识符扫描器、单元试验等
科学研究标识符级产品质量控制技术主要有下列几个方面的原因:
1、随著精确试验等基本概念的蓬勃发展,对标识符覆盖面积的倚赖逐渐减轻,标识符插桩的操控性、准确度、及时性等都成为业内要化解的痛点;
2、随著智能,特别是如前所述信用风险驱动力的试验发展,对标识符的认知须要获得冲破,就可以更快的从标识符实现中发掘信用风险、推论信用风险;
3、在Vellore等级的试验,产品质量教育工译者常常是透过第一类的回到Longuyon在虚无探测对下的极度表现从而辨认出痛点,但是其实可能许多潜在性的极度并没有到“裸眼”可探测到的级别而导致痛点JGD5,这时就须要有更多的第一类细的运转数据马萨省产品质量教育工译者分析去辨认出痛点的破绽,譬如:缓存外泄、操控性转差等,所以业内有许多prof、闪电图、asan等偏白盒静态检验痛点的控制技术出现;
4、标识符作为产生前述痛点前沿的炮兵阵地,绝大部分痛点都能卡日丹到前段标识符片面,如果能在标识符等级直接停售痛点,不论从模拟维数、复原生产成本、功能定位生产成本等均会获得很大明显改善;
5、标识符是技师沟通交流的T台,透过对标识符级产品质量控制技术的科学研究和规范化,能推动标识符更加的具备鲁棒性和更优质的设计如单测提升可测性等,也能推动产品质量保障人员对标识符加深掌控与认知,从而在产品质量保障各类场合发挥关键作用。
从指导产品质量行为、很大提升停售痛点能力面进行探索和落地,接下来的文章中会依次为大家如是说。
二、标识符级产品质量控制技术架构
要认知标识符级产品质量控制技术的原理和后续的主要应用场景,首先要认知标识符从语言到可执行态的基本过程,下面以C++为例说下基本过程:
C++从标识符到可执行bin文件,主要分为四个阶段:预处理、编译、汇编和链接。
预处理:处理一些#号定义的命令或语句(如#define、#include、#ifdef等),生成.i文件;
编译:进行词法分析、语法分析和语义分析等,生成.s的汇编文件,大家熟悉的AST抽象语法树就在该过程产生;
汇编:将对应的汇编指令翻译成机器指令,生成二进制.o目标文件;
链接:链接分为两种,静态链接:将静态链接库中的内容直接装填到可执行程序中;静态链接:只在可执行程序中记录与静态链接库中共享第一类的映射信息。
来认知标识符推论信用风险,能用来指结构化标识符结构,供自动生成单元试验和标识符检验提供基础数据;如植入对应目标标识符,能用来做插桩(即覆盖面积采集)或静态数据采集等。
如前所述上述如是说与认知,我们把标识符级产品质量控制技术划分大范围为两个层次,两个层次内包含多个层次,如下图所示:
大层次一:标识符认知,CodeC(Code Comprehend):偏底层控制技术,如前所述底层AST等能力、分析出标识符的特性(AST、调用链、倚赖等)和风险度,透过API、SDK等方式对外提供基础服务
存储层:主要用来标识符编译过程的基础数据和对应的数据存储选型调优等,在这个过程主要难点在于基础工具的选型和过程操控性的调优,以达到能在业务应用的目标;
分析层:分析层是依托基础的数据,根据特定的要求,对数据进行结构化的建模,如函数调用链、倚赖关系等,做好基础的分析供上层应用;
模型层:用于透过分析层和基础数据,去训练标识符存在的潜在性信用风险或信用风险偏向(操控性痛点突出等);
API层:透过API、SDK等方式对外提供基础服务。
该层会遇到众多控制技术挑战,如要适配不同语言的解析器、编译过程;基础架构进行标识符调优;分析过程数据缺失复原等,是一项非常细致且有控制技术挑战的工作,当然我们在该过程也会探索出一些控制技术经验供大家参考。
大层次二:标识符级产品质量控制技术应用,Codeπ:主要是依托标识符认知的过程或产出,植入对应的信息,以达到对应的产品质量目标,这个层次应用场景是关键,因此我们是以化解痛点的目标为导向,对该层次进行细分,所以目标或应用场景的不同会使得该层次的分类会不断增加,目前分为下列四类:
CodeQ(Code Quality): 与停售痛点相关(智能UT、如前所述规则的标识符缺陷检验、如前所述AI的标识符缺陷检验、闪电图、ASAN等在个分类);
运转行为数据;
CodeH(Code Health):评估标识符健康度(类似sonarcube等)、标识符信用风险度评估用于决策后续的产品质量行为;
CodeDL(Code defect location):标识符缺陷功能定位。
下面的章节我们会分布从第二级的层次,为大家做基本原理和过程如是说,后续还会有系列发文再深入的如是说对应实现内容。
三、标识符认知层如是说
的知识信息,这些信息能用于软件开发、软件试验、软件维护等各个阶段,旨在对程序进行操控性优化和正确性验证。标识符认知常用的分析方向有静态分析、静态分析、非源码分析3类,但是随著LLM大模型的发展,我们也正在科学研究模型在标识符认知领域的冲破与应用。
静态分析:是指在不运转标识符的方式下,透过词法分析、语法分析、控制流、数据流分析等控制技术对程序标识符进行扫描器,验证标识符是否满足规范化性、安全性、可靠性、可维护性等指标的一种标识符分析控制技术。
静态分析:软件系统在模拟的或真实的环境中执行之前、之中和之后,对软件系统行为的分析。
非标识符分析:主要是对数据文件、配置文件等非源码文件和源码间进行关联分析,当标识符仓变更时,能感知变更内容对源码、功能的影响。
静态分析多为对程序进行的一些功能试验或操控性试验等对程序的运转结果,资源使用情况的相关程序分析工作。故本小节主要如是说静态程序分析相关的标识符认知控制技术,不对静态程序分析做展开。
静态程序分析在不执行程序程序的情况下对程序进行分析,分析的第一类能是针对特定版本的源标识符或者二进制文件,透过词法分析、语法分析、控制流、数据流分析等控制技术对程序标识符进行扫描器,根据不同的分析目标,获得对应的分析结果。在学术界和工业内主要应用在软件安全领域,验证标识符是否满足规范化性、安全性、可靠性、可维护性;在百度内部,除漏洞检验外,静态程序分析还包括多维度的标识符分析和度量手段,在交付系统和监测系统中被广泛使用。
业内静态分析一般如前所述下列4种方式展开:
关键字匹配,如前所述正则表达式分析
如前所述AST的标识符分析,结合正则表达式和关键字能力
优点:结合语法和语义,能引入作用域等更多基本概念,更准确。
缺点:无法应对所有场景,另外,如前所述AST来分析获得的数据流,忽略了分支、跳转、循环等影响执行过程顺序的条件,缺少控制流信息。
如前所述IR/CFG的标识符分析等自制的中间语言数据结构分析
属于当前比较主流的标识符分析方案,例如被源伞,实现了多种语言生成统一的IR,这样一来对于新语言的扫描器支持难度就变得大大减少。
IR:是一种类似于汇编语言的线性标识符,其中各个指令按照顺序执行。其中现在主流的IR是三地址码(四元组),例如llvm的IR。
CFG:(Control flow graph)控制流图,在程序中最简单的控制流单位是一个基本块,在CFG中,每一个节点代表一个基本块,每一个边代表一个可控的控制转移,整个CFG代表了整个标识符的的控制流程图。如前所述IR来生成获得CFG。
如前所述QL(Query Language)分析
例如codeQL,把源标识符转化成一个可查询的数据库,透过 对源标识符工程进行关键信息分析提取,构成一个关系型数据库。安全漏洞、Bug 和其他错误被建模为可针对从标识符中提取的数据库执行的查询。
常用的静态程序分析控制技术:
数据流分析
数据流分析收集程序运转到不同位置时各个值的信息和它们随时间变化的信息。污点检验是一个典型的透过数据流分析进行程序信用风险检验的例子,它会找到所有的可能被使用者修改的变量(也就是有“污点”、不安全的变量),并阻止这些变量在被复原安全漏洞前被使用。
控制流分析
用于分析程序控制流结构的静态分析控制技术,目的在于生成程序的控制流图,在污点分析、编译器设计、程序分析、程序认知等领域都有重要应用。
指针分析
指针分析主要用于分析指针所有可能指向的第一类,它会分析出一个指针所指向的缓存位置和所对应的第一类。能用于调用分析、标识符优化、Bug追查、安全性分析与验证试验。
四、标识符级应用之探针
标识符探针,也是插桩控制技术,它是在保证被测程序原有逻辑完整性的基础上在程序中插入一些探针(又称为“探测仪”,本质上就是进行信息采集的标识符段,能是赋值语句或采集覆盖信息的函数调用),透过探针的执行并抛出程序运转的特征数据,透过对这些数据的分析,能获得程序的控制流和数据流信息,从而获得逻辑覆盖等静态信息,从而实现试验目的的方法。
不同语言的插桩技术有所不同,常见的控制技术有:ccover、covtool、jacoco、gocov。
CodeP标识符探针能应用在: 标识符监控(方法执行耗时等),标识符分析(函数、数据流的跟踪等),业务埋点。
除此之外,标识符探针最常见的场景是标识符覆盖面积采集。
4.1 覆盖面积
标识符覆盖面积,是软件试验中的一种度量,描述程序中源标识符被试验的比例和程度,所得比例称为标识符覆盖面积 ,分析未覆盖部分的标识符,从而反推在前期试验设计是否充分,没有覆盖到的标识符是否是试验设计的盲点。覆盖面积统计的分类包含:
行覆盖面积:行覆盖面积是最基本的指标,表示是否标识符中的每个可执行语句都被执行过;
分支覆盖面积:分支覆盖使用一组试验参数来试验是否标识符中所有的分支都能被试验到了;
路径覆盖面积: 对包括所有分支在内的所有的路径都能试验一遍,这就是路径覆盖;
变更行覆盖面积:上一次发布标识符后更新的标识符的行覆盖面积,这个数据能方便的看出新的标识符是否做了试验。
覆盖面积的业务使用场景广泛比如:RD自测、RD准入、QA准出、外包评估、精确试验、集成试验、基线升级评估、灰度试验评估,自动化试验能力评估、众测等。
标识符探针实现覆盖面积统计的步骤如下:
1、识别待插桩的函数
2、用codep控制技术对函数进行插桩,插桩控制技术分为:
源码插桩: 侵入式的在源标识符的基础上替换或者插入另外一些标识符
编译过程插桩: 在字节码文件中写入桩函数 (如asm、javassit等控制技术)
3、探针采集覆盖信息整合, 统计覆盖面积数据
五、标识符级应用之停售
从停售极度痛点的角度如是说两类标识符级控制技术应用:智能UT、SA。与现有极度试验方法进行对比分析,压力试验、功能试验倚赖编译运转且需人工构造极度场景,存在高生产成本、低停售的问题。而智能UT和SA如前所述白盒分析产出的数据能提前、快速、低生产成本、轻量级地停售极度痛点。
5.1 智能UT
单元试验(unit testing),是指对软件中的最小可试验单元进行检查和验证,这里的最小试验单元是指函数或者类。在痛点停售微观,UT针对最小单元进行试验,构造数据简单、易于验证正确性,便于后续功能的回归,能够更早地辨认出痛点,功能定位和化解痛点生产成本低
传统UT倚赖开发人员人工编写单测标识符来进行试验,存在开发生产成本高、倚赖人的意识等缺点。如前所述单测的基本原理衍生出了智能UT工具。智能UT透过自动的分析函数和随机的构造试验数据,可自动生成极度单元试验标识符,生成的标识符能直接用于单元试验任务,单元试验运转后,智能UT工具能分析标识符中存在的稳定性痛点。
如下图展示,智能UT建设的主要思路是将一个开发人员编写单元试验标识符的过程进行拆解,将整个过程抽象为确认待试验函数->分析标识符->构造试验数据->生成试验代码四个步骤,利用白盒数据和一系列算法模拟上述单测标识符生成的过程从而自动地生成极度单元试验标识符并应用于单元试验任务。
△UT与智能UT过程对比
5.2 SA-如前所述规则的标识符缺陷检验
SA(static analysis)意为静态标识符扫描器,整个扫描器过程无需编译运转,仅透过词法分析,语法分析,语义分析等控制技术对标识符进行扫描器,从而辨认出标识符逻辑错误和编程缺陷。依据编程语言的自身特性,可将各类信用风险场景提取转化为通用的规则进行极度拦截。现有SA检查是透过倚赖标识符分析、如前所述通用的信用风险规则进行标识符缺陷检查的静态标识符扫描器工具,可停售例如空指针访问、数组越界、除零等信用风险痛点。
下图展示了如前所述规则的静态标识符检查处理流程。
△SA处理流程架构
优点:无需编译运转、资源消耗少,扫描器分析过程高度自动化、不倚赖人力。
缺点:倚赖后验知识、存在滞后性,倚赖人开发规则、准召低、可持续性差。
此外在标识符级领域还有专门被测第一类静态行为的检验控制技术,用于辨认出程序细微的极度,比如业内常用的闪电图、gprof、ASAN等工具,就是在程序运转时收集程序表现数据,用于检验程序极度痛点。
六、标识符级应用之孤岛函数识别
6.1 什么是孤岛函数
不被调用的函数被称为孤岛函数。如果一个函数已不再被调用,就成了无用的废弃函数。
6.2 为什么要做孤单函数识别
无用函数属于控制技术债治理的场景之一,无用标识符的存在增加了软件开发、试验、以及痛点排查的开销,例如QA和RD须要更多额外的精力来评估需求的影响范围。
透过孤岛函数识别的能力能做无用标识符和相关用例、配置、数据的清理,提升标识符可维护性,同时提升痛点的排查效率。
6.3 如何识别孤岛函数
1、静态分析方法
原理:透过函数调用分
优点:执行速度快,开发生产成本低。
缺点:受限于不同语言特性,识别准确率须要持续优化。例如:配置反射调用、多态特性下识别准确率更低。
2、静态分析方法
原理:透过探针的方式,在程序运转时对函数调用栈进行记录,一般是如前所述抽样或者开关的方式来控制。
优点:识别准确率相比静态分析方法要高。
缺点:标识符侵入对操控性有损,同时也受限于流量丰富度,可能须要接入适配。
3、动静结合方法
将上述两种方法结合起来时使用,进行能力互补。
这篇文章更多的是从大背景、结构和各个层的基本基本概念如是说了标识符级产品质量
———- END ———-