从 StackOverFlow 复制过来的代码,结果......

(贸然复制代码的后果……)

StackOverflow 已经成为许多程序员的救星,包括我。

在编程中,我们经常会搜索问题或 bug ,然后跳转到 Stack Overflow 寻找答案。这个习惯很方便,但在无意中,我们可能会使用一些包含严重错误的代码。即使大家都知道从 StackOverflow 复制粘贴代码是一个坏主意,但开发人员仍然会这样做。

复制代码本身并不总是一件坏事。

代码重用可以提高软件开发效率,为什么要解决一个已经被解决好了的问题呢?

但是,当开发人员使用示例代码却没有试图理解其含义时,就可能出现问题。

—— 瑞安 - 多诺万

你可能会认为这是在危言耸听,但我可以向你保证,他不是。

最近我遇到了几件引起我注意的事情,我将对每一件事做一个简短的介绍。

Ctrl C + Ctrl V ,完成工作!

Illustration by Mateusz Kupilas

一、迄今为止,StackOverflow复制数最多的 Java 代码是有缺陷的!

我第一次看到这个是在一个博客上。而这篇博客文章,是由那段代码的作者亲自写的。

这段代码的作者安德里亚斯是 Palantir 的 Java 开发人员,也是 StackOverflow 排名最高的贡献者之一,他承认了这个缺陷。

2018 年,塞巴斯蒂安・巴尔特斯 (Sebastian Baltes) 在《实证软件工程》期刊上发表了一篇研究论文,其中指出安德里亚斯在 StackOverflow 上发布的一段代码片段是复制最多的 Java 代码,并在开源项目中被重复使用。它已经被复制和嵌入到 6000 多个 Github Java 项目中。

这个代码片段于 2010 年发布在 Stack Overflow 上,它的功能是将字节计数转换为更易于阅读的格式。例如将 1024 字节转换为 1kB 或将 1048576 字节转换为 1 MB。

在被 Sebastian Baltes 告知他的代码造成的影响后,安德里亚斯重新访问了代码,并在他的博客上发布了一个更正后的版本。

在文章的最后,安德里亚斯为开发者提供了一些有价值的建议:

  • 堆栈溢出代码段可能会有 bug,即使它有着成千上万的赞成票。

  • 请测试所有特殊情况,特别是从 StackOverflow 复制的代码。

  • 在复制代码时,一定要注明代码的来源。

尽管这个 bug 是一个很小的事件,只会导致对文件大小的不准确估计,但实际情况可能更糟。让我们看更多的例子。

二、StackOverflow 上流传最广的 c++ 代码也有缺陷

Morteza Verdi 等人在 2019 年发表的一篇研究论文发现,在过去 10 年里,StackOverflow 上最流行的 c++ 代码片段中存在 69 个重大安全漏洞。

这 69 个代码片段被使用在 2589 个 GitHub 项目里。研究人员认为,其中最常见漏洞是 CWE150:

CWE 是社区开发的常见软件和硬件安全缺陷列表。它可以作为一种通用语言、安全工具的度量标准。

论文的研究人员开发了一个 chrome 扩展,可以提醒开发者他们正在查看的 StackOverflow 代码片段是否存在安全漏洞。

三、在 Windows 系统中,你不能同时打开 Docker 和雷蛇驱动,因为它们包含了 StackOverflow 的 Bug

两年前,windows 上的 Docker 出现了一个奇怪的问题。人们无法在 windows 系统中启动 Docker。这个奇怪的问题是一个 Github 用户发现的,其他的用户说他们也遇到过这个问题。

没有人知道到底哪里出了问题,直到 Reddit 的这篇文章出现。

当雷蛇驱动在后台运行时,如果您尝试运行 Docker 时就会遇到这个问题。Docker 会认为已经有一个实例在运行,所以不会启动。

两个应用程序都只希望运行自己的一个实例。尽管这似乎是一个合理的要求,但这可能是错误的根本原因。导致 Bug 的错误代码是这样的:

问题在于:返回的 GUID 是 System.Reflection.RuntimeAssembly  的 GUID 类型,并不是 Docker 中为 Windows 程序集定义的类型的 GUID。

有趣的是:

如果只有一个应用程序使用了上述的代码片段,是不会出现问题的。但如果两个程序都使用了错误的代码片段就会报错。

猜猜这两个应用程序的代码片段是从哪里来的呢?

—— StackOverflow

这就是他们获取错误代码的问题来源:

现在你已经看不到这个有缺陷的答案了,因为他们已经重新编辑过了。如果您想自己查看,可以访问该页面的旧存档。

四、我应该放弃复制代码吗?

并不是。

StackOverflow 对于当今的任何开发人员都是必不可少的,但是在项目中发现的大多数问题都是基本的安全错误。如果你知道你在复制什么,那么使用它也没什么坏处。但是为了使代码可以用于生产,你应该有足够的测试,特别是针对一些边缘情况的测试。

“如果你借东西,但不明白借的是什么,你就会陷入这些代码的陷阱,掉入潜在的漏洞。然后你又把这些东西传播开了。”

如果您要使用这些代码,先去理解它。

—— 瑞安・多诺万

最后,祝大家编程快乐!

作者:Mahdhi Rezvi

出处:https://medium.com/better-programming/why-code-snippets-from-stack-overflow-can-break-your-project-ced579a48ddb

翻译:实验楼

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值