CN110321130B - 基于系统调用日志的不可重复编译定位方法 - Google Patents
基于系统调用日志的不可重复编译定位方法 Download PDFInfo
- Publication number
- CN110321130B CN110321130B CN201910549431.6A CN201910549431A CN110321130B CN 110321130 B CN110321130 B CN 110321130B CN 201910549431 A CN201910549431 A CN 201910549431A CN 110321130 B CN110321130 B CN 110321130B
- Authority
- CN
- China
- Prior art keywords
- system call
- call log
- write
- file
- pid
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/30—Monitoring
- G06F11/34—Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment
- G06F11/3466—Performance evaluation by tracing or monitoring
- G06F11/3476—Data logging
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
Abstract
本发明提供一种基于系统调用日志的不可重复编译定位方法,属于软件编译领域。该方法首先通过对系统调用日志信息进行差异分析构建依赖图;再通过分析构建过程中父子进程关系对依赖图进行增强;最终通过遍历依赖图并排序,得到最终的问题构建命令,以便进行后续修复工作。本发明能够有效验证软件源代码与二进制包之间的对应关系,一旦发生不一致,能够定位到可能导致软件不可重复编译的构建命令。
Description
技术领域
本发明属于软件编译领域,涉及一种用于检测和定位软件中导致软件不可重复编译的构建命令,具体为基于系统调用日志的不可重复编译定位方法。
背景技术
软件的可重复编译性是验证软件编译环境安全性的重要环节,并且对于软件调试、错误修复、存储缓存命中等任务有重要意义。可重复编译的定义如下:软件的可重复编译性是指,给定软件包的源代码和编译环境描述,多次重复编译软件源代码后,得到相同的二进制结果。二进制结果的一致性可以通过md5或sha-1哈希值比对进行验证。对于编译环境,指软件包的多次编译保持不变的因素,如编译器版本、计算机架构类型、依赖软件包版本信息等。其他信息,为了模拟软件在不同编译设备进行构建的场景,除固定因素外,其他因素可以变化。典型的变化因素包括时间和日期、构建路径、主机名域名、时区、系统语言、用户名、用户组、CPU类型等信息。
软件的可重复编译性质是软件环境安全的基础,能够用于检测软件编译环境是否被修改,并对于软件调试等任务有重要意义。由于定位导致不可重复编译的问题文件任务有可用信息少、问题原因众多等挑战,此问题的定位工作主要手工完成。
发明内容
为解决上述问题,本发明提供了一种基于系统调用日志的不可重复编译定位方法,本发明通过对系统调用日志进行差异分析,构造依赖图,并通过遍历依赖图和排序实现问题构建命令的定位。
本发明的技术方案:
一种基于系统调用日志的不可重复编译定位方法,步骤如下:
步骤1:构建编译环境,得到二进制包
构建一号编译环境,在一号编译环境中编译待检测和定位的源文件,得到一号二进制包;构建二号编译环境,在二号编译环境中编译待检测和定位的源文件,得到二号二进制包。
编译环境由固定部分和扰动部分构成。其中固定部分在一号和二号编译环境中保持不变,包括编译器种类和版本,构建需要的依赖和其版本。扰动部分在一号和二号编译环境中不同,包括语言环境(中文和英文)、时间(当前时间和随机选择的时间)、时区(如东八区UTC+8和中部标准时区CST)等,并可根据需要进行定制其他环境变量。
在编译待检测和定位的源文件时,使用strace(system call tracer)等系统调用监控工具捕获构建过程中的系统调用日志,所述的系统调用日志包括execve、read、write和rename。其中,strace是以BSD许可证发布的开源工具,能够监控指定程序运行时的所有系统调用信息。Linux平台下,系统调用监控也可采用perf(Linux profiling withperformance counters)、sysdig等工具实现。OSX平台下,可使用dtruss(Trace systemcalls and userland stacks using DTrace)实现相同功能。在Windows平台,可使用ETW工具(Event Tracing for Windows)实现系统调用监控。
步骤2:调用系统调用日志解析程序,转化提取系统调用日志
调用系统调用日志解析程序,从步骤1中系统调用监控工具捕获的文本格式的系统调用日志中进行转化提取,存入数据库。
步骤3:使用比对工具,提取比对日志中不一致文件的文件名
使用比对工具将一号二进制包和二号二进制包进行递归比较,列出两个二进制包中的不一致文件;当比较结果完全一致时,则报告软件包可重复编译;否则,将比对工具输出的文件作为比对日志,并将比对日志作为问题文件定位的基础进行文件名提取;所述的文件名提取过程为:从比对工具输出的比对日志中提取出与两个编译环境中生成的二进制包中所包含的内容不一致的文件,将不一致文件的文件名作为定位的基础。所述的比对工具包括diffoscope、pkgdiff(package diff)或其他自定义的比对工具。
步骤4:调用系统调用差异分析程序,构建系统调用差异集合write-diff
调用系统调用差异分析程序,根据步骤2构建的数据库中的系统调用信息建立系统调用差异集合write-diff:构建规则如下:首先构造写系统调用差异集合write-diff,如果一个构建命令在两次构建中,调用了write系统调用日志,并且在两次构建时,write系统调用日志所写数据不一致,则将其中第一次构建时的哈希值加入write-diff。
步骤5:调用依赖图构建程序,构造依赖图
调用依赖图构建程序,根据步骤4中的系统调用差异集合write-diff构造依赖图;构建规则如下:对于write-diff中对应的每一个系统调用,首先获得其写入的文件f、写入时间t和对应的进程编号pid,f、t和pid通过解析系统调用日志中write系统调用的参数获得;如果在当前write系统调用日志结束后,存在另一个read系统调用日志,其读取文件为f,写入时间t'>t,进程编号为pid',则在依赖图中加入两个节点,分别对应编号为pid和pid'的进程,并且在两个节点加入一条边,由pid'指向pid;类似的,如果在进程编号为pid的进程写入f文件后,存在rename系统调用日志,将文件f重命名为f',之后在进程编号为pid'的进程中读取f',同样在pid'与pid对应节点之间建立依赖边。
步骤6:调用依赖图增强程序,获得增强依赖图
在步骤5得到的依赖图基础上,针对每个节点,获取其对应的进程编号pid,根据系统调用日志解析获取其父进程编号ppid,并建立pid与ppid对应节点之间的依赖边。
步骤7:调用排序程序,遍历依赖图,捕获问题构建命令
在步骤6获得的依赖图中,首先获得不一致文件最后被访问的节点,即针对步骤3中每个不一致文件,找到访问该文件的、具有最大时间戳的read、write系统调用日志所在的进程;并在步骤6获得的增强依赖图中,找到其对应的节点;接着,从找到的节点出发,使用广度优先遍历算法,构造可达子图,即获得从种子节点出发,可以达到的图中出度为0的节点;获得出度为0的节点对应的进程中,write系统调用日志所写的数据data;计算data与增强依赖图中其他节点对应进程中,read或write系统调用日志读写数据data'之间的文本相似度,并根据累加相似度对出度为0的节点进行排序;在列表中排序越高的节点,其对应的进程中调用的execve系统调用日志对应的构建命令越可能是导致产生不一致文件的原因。
本发明的有益效果:本发明能够有效验证软件源代码与二进制包之间的对应关系,一旦发生不一致,能够定位到可能导致软件不可重复编译的构建命令。
附图说明
图1是本发明的基于系统调用日志的不可重复编译定位方法的流程示意图。
具体实施方式
以下结合附图和技术方案,进一步说明本发明的具体实施方式。
本发明的方法部署在一台构建服务器上,根据软件构建指令安装对应的软件,如编译器、脚本解释器等。方法由环境扰动脚本、系统调用日志解析程序、系统调用差异分析程序、依赖图构建与增强程序、排序程序构成。
如图1所示,一个软件包是否可重复编译按如下流程进行验证。在两个编译环境,除了编译环境中指定的确定因素(包括编译器种类和版本,构建需要的依赖和其版本),其他因素均可设置为不同的取值。
使用环境扰动脚本在两次构建过程开始前设置环境变量、时区等信息,以模拟在不同构建服务器构建的过程。特别的,在每次构建时,使用strace等系统调用监控工具捕获构建过程中所有的系统调用信息,用于过滤构建环境时调用的命令和涉及的文件。
步骤1:在构建编译环境1,编译待检测和定位的源文件,得到二进制包1。在构建时,使用strace工具捕获构建过程中的系统调用信息,需要关注的系统调用包括execve、read、write和rename。Strace是以BSD许可证发布的开源软件,能够监控指定程序运行时的所有系统调用信息。在运行时,需要保证监控构建过程的所有子进程。这一功能可以通过在运行strace时传递参数-f实现,其中-f参数表示strace在监控时会跟踪构建过程中产生的所有子进程。
在构建编译环境2,编译同样的源文件,得到二进制包2。在构建时,使用strace工具捕获构建过程中的系统调用信息。
步骤2:调用系统调用日志解析程序,从步骤1中系统调用监控工具捕获的文本格式的系统调用日志中进行转化提取,存入数据库。
后续步骤描述时以Linux平台下的strace为例。具体步骤可根据平台进行调整。
步骤3:两个版本的二进制包使用比对工具进行比较。默认采取diffoscope实现这一过程。diffoscope是以GPL v3许可证发布的开源软件,能够自动实现对二进制包进行解包,并递归遍历两个二进制包的结构进行比对,列出两个二进制包中的不一致文件。如果二进制包比对结果为完全一致,则报告软件包可重复编译。否则,将diffoscope输出的文件作为比对日志。该日志将作为问题文件定位的基础。
给定由diffoscope输出的比对日志,对其进行文件名自动提取。从diffoscope比对日志可以提取出两个版本二进制包中包含的、内容不一致的文件名。提取所得的不一致的文件名字符串即作为基础查询条件。
步骤4:调用系统调用差异分析程序,构建规则如下:首先构造写系统调用差异集合write-diff,即如果一个构建命令在两次构建中,调用了write系统调用日志,并且在两次构建时,write系统调用日志所写数据的哈希值不一致,则将其中第一次构建时的哈希值加入write-diff。
步骤5:调用依赖图构建程序,根据差异集合write-diff构造依赖图。构建规则如下:对于write-diff中对应的每一个系统调用日志,首先获得其写入的文件f、写入时间t和对应的进程编号pid,这些信息可以通过解析系统调用日志中write系统调用日志的参数获得。如果在当前write系统调用日志结束后,存在另一个read系统调用日志,其读取文件为f,写入时间t'>t,进程编号pid',则在依赖图中加入两个节点,分别对应编号为pid和pid'的进程,并且在两个节点加入一条边,由pid'指向pid。类似的,如果在进程编号为pid的进程写入f文件后,存在rename系统调用日志,将文件f重命名为f',之后再进程编号为pid'的进程中读取f',同样再pid'与pid对应节点之间建立依赖边。
步骤6:调用依赖图增强程序,获得增强依赖图:在步骤5得到的依赖图基础上,针对每个节点,获取其对应的进程编号pid,根据系统调用日志解析获取其父进程编号ppid,并建立pid与ppid对应节点之间的依赖边。
步骤7:调用排序程序,遍历依赖图,捕获问题构建命令:在步骤6获得的增强依赖图中,首先获得不一致文件最后被访问的节点,即针对步骤3中每个不一致文件,找到访问该文件的,具有最大时间戳的read、write系统调用日志所在的进程。在步骤6获得的增强依赖图中,找到其对应的节点。接着,从这些节点出发,使用广度优先遍历算法,构造可达子图,即获得从种子节点出发,可以达到的图中出度为0的节点。针对这些节点,获得其对应进程中,write系统调用日志所写的数据data。计算data与增强依赖图中其他节点对应进程中,read或write系统调用日志读写数据data'之间的文本相似度,并根据累加相似度对出度为0的节点进行排序。在列表中排序越高的节点,其对应的进程中execve系统调用日志对应的执行的构建命令越可能是导致产生不一致文件的原因。
Claims (3)
1.一种基于系统调用日志的不可重复编译定位方法,其特征在于,步骤如下:
步骤1:构建编译环境,得到二进制包
构建一号编译环境,在一号编译环境中编译待检测和定位的源文件,得到一号二进制包;构建二号编译环境,在二号编译环境中编译待检测和定位的源文件,得到二号二进制包;
编译环境由固定部分和扰动部分构成;其中固定部分在一号和二号编译环境中保持不变,扰动部分在一号和二号编译环境中不同;
在编译待检测和定位的源文件时,使用系统调用监控工具捕获构建过程中的系统调用日志,所述的系统调用日志包括execve、read、write和rename;
步骤2:调用系统调用日志解析程序,转化提取系统调用日志
调用系统调用日志解析程序,从步骤1中系统调用监控工具捕获的文本格式的系统调用日志中进行转化提取,存入数据库;
步骤3:使用比对工具,提取比对日志中不一致文件的文件名
使用比对工具将一号二进制包和二号二进制包进行递归比较,列出两个二进制包中的不一致文件;当比较结果完全一致时,则报告软件包可重复编译;否则,将比对工具输出的文件作为比对日志,并将比对日志作为问题文件定位的基础进行文件名提取;所述的文件名提取过程为:从比对工具输出的比对日志中提取出与两个编译环境中生成的二进制包中所包含的内容不一致的文件,将不一致文件的文件名作为定位的基础;
步骤4:调用系统调用差异分析程序,构建系统调用差异集合write-diff
调用系统调用差异分析程序,根据步骤2构建的数据库中的系统调用信息建立系统调用差异集合write-diff:构建规则如下:首先构造写系统调用差异集合write-diff,如果一个构建命令在两次构建中,调用了write系统调用日志,并且在两次构建时,write系统调用日志所写数据不一致,则将其中第一次构建时的哈希值加入write-diff;
步骤5:调用依赖图构建程序,构造依赖图
调用依赖图构建程序,根据步骤4中的系统调用差异集合write-diff构造依赖图;构建规则如下:对于write-diff中对应的每一个系统调用,首先获得其写入的文件f、写入时间t和对应的进程编号pid,f、t和pid通过解析系统调用日志中write系统调用的参数获得;如果在当前write系统调用日志结束后,存在另一个read系统调用日志,其读取文件为f,写入时间t'>t,进程编号为pid',则在依赖图中加入两个节点,分别对应编号为pid和pid'的进程,并且在两个节点加入一条边,由pid'指向pid;如果在进程编号为pid的进程写入f文件后,存在rename系统调用日志,将文件f重命名为f',之后在进程编号为pid'的进程中读取f',同样在pid'与pid对应节点之间建立依赖边;
步骤6:调用依赖图增强程序,获得增强依赖图
在步骤5得到的依赖图基础上,针对每个节点,获取其对应的进程编号pid,根据系统调用日志解析获取其父进程编号ppid,并建立pid与ppid对应节点之间的依赖边;
步骤7:调用排序程序,遍历依赖图,捕获问题构建命令
在步骤6获得的依赖图中,首先获得不一致文件最后被访问的节点,即针对步骤3中每个不一致文件,找到访问该文件的、具有最大时间戳的read和write系统调用日志所在的进程;并在步骤6获得的增强依赖图中,找到其对应的节点;接着,从找到的节点出发,使用广度优先遍历算法,构造可达子图,即获得从种子节点出发,可达到的图中出度为0的节点;获得出度为0的节点对应的进程中,write系统调用日志所写的数据data;计算data与增强依赖图中其他节点对应进程中,read或write系统调用日志读写数据data'之间的文本相似度,并根据累加相似度对出度为0的节点进行排序;在列表中排序越高的节点,其对应的进程中调用的execve系统调用日志对应的构建命令越可能是导致产生不一致文件的原因。
2.根据权利要求1所述的一种基于系统调用日志的不可重复编译定位方法,其特征在于,系统调用监控工具包括strace、perf、sysdig、dtruss和ETW工具。
3.根据权利要求1或2所述的一种基于系统调用日志的不可重复编译定位方法,其特征在于,所述的比对工具包括diffoscope或pkgdiff。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910549431.6A CN110321130B (zh) | 2019-06-24 | 2019-06-24 | 基于系统调用日志的不可重复编译定位方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910549431.6A CN110321130B (zh) | 2019-06-24 | 2019-06-24 | 基于系统调用日志的不可重复编译定位方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110321130A CN110321130A (zh) | 2019-10-11 |
CN110321130B true CN110321130B (zh) | 2021-04-16 |
Family
ID=68120129
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910549431.6A Active CN110321130B (zh) | 2019-06-24 | 2019-06-24 | 基于系统调用日志的不可重复编译定位方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110321130B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111597089B (zh) * | 2020-05-18 | 2020-12-18 | 广州锦行网络科技有限公司 | 一种Linux系统调用事件采集和缓存装置及方法 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0405845A3 (en) * | 1989-06-26 | 1992-08-12 | International Business Machines Corporation | Performing compilation optimisation procedures in an optimisation compiler |
CN1482540A (zh) * | 2002-08-02 | 2004-03-17 | ���µ�����ҵ��ʽ���� | 编译程序、编译程序装置和编译方法 |
-
2019
- 2019-06-24 CN CN201910549431.6A patent/CN110321130B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0405845A3 (en) * | 1989-06-26 | 1992-08-12 | International Business Machines Corporation | Performing compilation optimisation procedures in an optimisation compiler |
CN1482540A (zh) * | 2002-08-02 | 2004-03-17 | ���µ�����ҵ��ʽ���� | 编译程序、编译程序装置和编译方法 |
Non-Patent Citations (1)
Title |
---|
编译原理立体化教学体系建设探索;徐秀娟;《计算机教育》;20170610;全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN110321130A (zh) | 2019-10-11 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102804147B (zh) | 执行abap源代码的代码检查的代码检查执行系统 | |
Liang et al. | AntMiner: mining more bugs by reducing noise interference | |
CN110990020A (zh) | 一种软件编译方法、装置及电子设备和存储介质 | |
Xu et al. | Largescale system problem detection by mining console logs | |
CN111382070B (zh) | 兼容性测试方法、装置、存储介质和计算机设备 | |
CN106227654B (zh) | 一种测试平台 | |
Obbink et al. | An extensible approach for taming the challenges of JavaScript dead code elimination | |
CN107015841B (zh) | 一种程序编译的预处理方法及程序编译设备 | |
CN103186463B (zh) | 确定软件的测试范围的方法和系统 | |
Nam et al. | Marble: Mining for boilerplate code to identify API usability problems | |
CN116431476A (zh) | 一种基于代码上下文变异的jvm模糊测试方法 | |
EP3514680B1 (en) | Identification of changes in functional behavior and runtime behavior of a system during maintenance cycles | |
CN110321130B (zh) | 基于系统调用日志的不可重复编译定位方法 | |
Quante et al. | Dynamic object process graphs | |
Bocic et al. | Symbolic model extraction for web application verification | |
US9396239B2 (en) | Compiling method, storage medium and compiling apparatus | |
CN116578282A (zh) | 代码生成方法、装置、电子设备及介质 | |
CN114691197A (zh) | 代码分析方法、装置、电子设备和存储介质 | |
CN113127367B (zh) | Android动态权限申请的缺陷检测方法 | |
CN111666216B (zh) | 一种智能合约分析方法及装置 | |
Borodin et al. | Deterministic static analysis | |
CN114490413A (zh) | 测试数据的准备方法及装置、存储介质和电子设备 | |
CN113392016A (zh) | 对程序异常情况处理的规约生成方法、装置、设备及介质 | |
CN112631944A (zh) | 基于抽象语法树的源码检测方法及装置、计算机存储介质 | |
CN113849814A (zh) | 一种可配置系统漏洞复现系统以及复现方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |