所以 StackOverflow 上复制最多的 Java 代码片段中,其实包含了一个 bug.
StackOverflow 相信大家都不陌生,它大概是全球最大最出名的编程领域问答社区了。这段代码的上传者名叫 Andreas Lundblad,他是 Palantir 的一位 Java 开发者,也是社区中回答贡献最高的作者之一。这个 bug 就是他亲自承认的。
2018年发布的一篇学术论文中提到 SO 社区中被提取和复制最多的代码就是 Lundblad 上传的这一段 Java 代码,内容是将字节数打印成人类可读的格式,比如将123,456,789字节处理为123.5 MB。它在大量开源项目中都被使用过。
这段代码是作为2010年9月发布的一个 SO 问题的答案被上传的,这段代码已经被嵌入到6,000多个 GitHub Java 项目中(Git 搜索结果见下图),比其它任何 Java 代码片段都要多。
在上周发表的一篇博客文章中,Lundblad 承认自己的这段代码存在缺陷,它错误地将字节数转换成了人类可读的格式:
publicstaticString humanReadableByteCount(long bytes, boolean si) {int unit = si ? 1000: 1024;if(bytes < unit) return bytes + " B";int exp = (int) (Math.log(bytes) / Math.log(unit));String pre = (si ? "kMGTPE": "KMGTPE").charAt(exp-1) + (si ? "": "i");returnString.format("%.1f %sB", bytes / Math.pow(unit, exp), pre);}
Lundblad 说,在阅读了一些学术文章之后他曾经再度审视了这一段代码,并且在自己的博客上发布了一个修正版本。
虽然这段代码中的缺陷仅仅是一个琐碎的数据转换错误,最后所导致的也可能只是文件大小的细微差别,但类似情况的后果有可能会更糟。如果这段代码中包含了一个安全缺陷,那么要修复所有使用这段代码的项目可能需要花上几个月甚至几年的时间,也让攻击者有机可乘。
即使大家都知道在网上 copy 他人的代码有风险,但大量程序员每天还是照做不误。
2018年的这项研究不仅揭露了这一段小小的有缺陷的代码,更值得大家深思的是在 Java 编程的生态中,copy 他人代码是多么普遍的行为。每天都有大量程序员在 SO 社区上的相关问题中直接复制最佳答案的代码,大部分时候甚至不会去检验这段代码作者是谁,代码中是否存在问题。
从 SO 复制代码并且不署名的开发人员实际上是对团队中的其他人隐瞒了他们在项目中引入未经审查的代码这一事实。
虽然这听起来可能过分严重,但2019年10月的另一项研究就表明 StackOverflow 上确实有很多包含安全漏洞的代码:该研究论文提到在过去的10年中,在 StackOverflow 上发布的69种最流行的 C++ 代码片段中发现了重大的安全漏洞。
研究人员表示,他们在总共2859个 GitHub 项目中发现了这69个易受攻击的代码片段,这显示了一个错误的 SO 答案能够如何对整个开源应用生态系统造成破坏。
原文作者:Andreas Lundblad