Stubbifier:删减动态服务器端JavaScript应用
软件工程
2021-10-28 v1
摘要
JavaScript日益成为服务器端开发的流行语言,部分得益于Node.js运行时环境及其庞大的模块生态系统。借助Node.js包管理器npm,用户可轻松将外部模块作为依赖包含于项目中。然而,npm安装模块时会包含其全部功能,即便仅需其中一小部分,这导致代码体积的不当增大。从发行版中消除这些未用功能固然可取,但由于JavaScript极强的动态性,找出未用代码所需的可靠分析十分困难。我们提出一种全自动技术,通过从应用测试构建静态或动态调用图来识别未用代码,并将视为不可达的代码替换为文件级或函数级桩(stub)。若某桩被调用,它将按需获取并执行原始代码,从而放宽对调用图可靠性的要求。该技术还提供一种可选的守护执行模式,以防护应用免受源于桩扩展的未测试代码中的注入漏洞。此技术实现于开源工具Stubbifier中,支持ECMAScript 2019标准。在对15个Node.js应用及其75个客户端的实证评估中,Stubbifier平均减少应用体积56%,且仅带来微小性能开销。评估还显示,Stubbifier的守护执行模式能够阻止若干出现在被桩化代码中的已知注入漏洞。最后,Stubbifier可与打包工具(将应用与其依赖打包的流行JavaScript工具)协同工作。对所考察的目标应用,我们测得打包后发行版平均体积减少37%。
引用
@article{arxiv.2110.14162,
title = {Stubbifier: Debloating Dynamic Server-Side JavaScript Applications},
author = {Alexi Turcotte and Ellen Arteca and Ashish Mishra and Saba Alimadadi and Frank Tip},
journal= {arXiv preprint arXiv:2110.14162},
year = {2021}
}
备注
29 pages. This work has been submitted to the Journal on Empirical Software Engineering