打破 Go 语言类型安全:关于 unsafe 包使用的实证研究
软件工程
2021-10-12 v4 机器学习
编程语言
摘要
自首次发布十年以来,Go 编程语言已成为开发领域中的主要编程语言之一。尽管因其简洁的语法和类 C 的性能而备受赞誉,Go 还包含一个强大的静态类型系统,可防止任意类型转换和任意内存访问,从而在设计中使语言具备类型安全。然而,为了给开发者实现底层代码的可能性,Go 附带了一个名为 unsafe 的特殊包,为开发者提供了绕过 Go 程序类型安全的一种方式。该包为开发者提供了更大的灵活性,但伴随着更高的运行时错误风险、不可移植的可能性,以及丧失对未来 Go 版本兼容性保证的风险。在本文中,我们提出了首个关于在 2,438 个流行 Go 项目中使用 unsafe 包的大规模研究。我们的调查表明,24% 的 Go 项目使用了 unsafe,主要动机是与操作系统和 C 代码通信,但也常用作性能优化的来源。开发者愿意使用 unsafe 来打破语言规范(例如字符串不可变性)以获得更好的性能,并且 6% 的使用 unsafe 的分析项目执行了可能导致程序崩溃和意外行为的风险指针转换。此外,我们报告了使用 unsafe 的项目所面临的一系列真实问题,从崩溃错误和非确定性行为,到其部署在某些流行环境中受到限制。我们的发现可用于理解开发者如何以及为何打破 Go 中的类型安全,并有助于推动进一步的工具和语言开发,使 Go 中 unsafe 的使用更加安全。
引用
@article{arxiv.2006.09973,
title = {Breaking Type Safety in Go: An Empirical Study on the Usage of the unsafe Package},
author = {Diego Elias Costa and Suhaib Mujahid and Rabe Abdalkareem and Emad Shihab},
journal= {arXiv preprint arXiv:2006.09973},
year = {2021}
}