为何 StackOverflow 上的代码片断会摧毁你的项目?

昨天公司里碰到一件使人哑然失笑的事情。帮朋友公司作的一个项目,作SIT测试的时候发现一些bug,仔细查了下缘由,原来是由于当初以为这个项目比较简单,交给了几个新入职的新丁,也算是给他们练练手,结果其中一位写了一段代码出现了问题结果致使bug的出现。c++

虽然问题不大很快就修复了,可是正所谓初生牛犊不怕虎,这位出问题的新丁不太服气,一直嚷嚷着他这段代码是从CSDN上找到的,别人都说好用他才用的。问了问他是否理解原文中那么写的缘由,结果才支支吾吾了半天讲不清楚,最后也认可他只是看到那段代码的结果是他要的,并非理解中间一些方法的运用究竟是什么逻辑。程序员

真是又好气又可笑,想一想如今的年轻人真是有个性,本身当年遇到这种状况只敢虚心求教,哪敢都没明白就去用一段代码,别人指出问题还忿忿不平。windows

也许是本身老了吧。晚上和一个刚从国外归国的同窗提及这个事情,他却是深有体会,说到他们在国外留学时,遇到技术问题想到网上咨询用的最多的是StackOverflow,相比起国内的CSDN,他以为StackOverflow上提问题的人和回答的人都更加严谨,不会有太多的废话和问题以外的讨论。按他的理解,CSDN上不少国内的技术新手纯粹是缺少独立思考的能力,都只是来求代码完成目标,不去探究为何这么写,自己CSDN上问题回答质量不高,这样很容易出事。安全

同窗的见解,一方面多是由于国内程序员需求极大,但总体浮躁、功利性的大环境致使不少培训机构没有培训到位,不少程序员都是一边开始工做一边学习;但另外一方面,不排除他崇洋媚外的自满情绪。因而,我便去查阅了下StackOverflow上面的内容和相关资料。并发

仔细研究后发现,其实StackOverflow没有同窗说的那么好,即便是该网站上的回答,也有不少有问题的代码。看来这仍是一个世界性通用的难题~ide

对于国外的程序员来讲,StackOverflow就是他们的CSDN,是他们遇到各类问题查询的第一选择,不少国外的程序员,会到StackOverflow上需求帮助,找到他们须要的解决问题的代码,而后不假思索的直接复制使用,和我公司出问题的那位年轻人同样,这个习惯很很差。学习

代码复制自己来讲并非什么坏事,咱们学开发的时候,确定老师都教过咱们代码复用能有效提升软件的开发效率。已经被解决了的问题,实在没有必要再去从新写一遍代码。可是这个前提是,使用者,也就是开发人员,必须知道你要用的这段代码的前因后果真正含义,就是你要真正明白你用的代码。测试

简单举个例子:网站

  • 几年前,不少程序员发现,在windows上使用Docker总是会碰到没法启动的问题,缘由一直不明,不少人都是重装了系统什么的才解决。后来有一个大神发文解释缘由后咱们才知道了为何

当 Windows 后台启动了 Razer Synapse 时,再去启动 Docker 就会触发此问题。根本缘由是,Razer Synapse 运行后,Docker 就会认为已经有一个 Docker 实例正在运行中,因此不会再启动一个实例,也就是真的Docker。this

为何会有这种状况呢?

由于有一段代码中,返回的 GUID 类型是 System.Reflection.RuntimeAssembly(系统层面的运行时程序集),而不是 Windows 中对应 Docker 程序集中定义的类型。Docker处理的逻辑就是在同一时间只容许运行一个实例,判断的方式就是经过判断 GUID 是否存在,但在获取GUID 时,用的是系统层面的而非本身独立程序集里面,从而致使了这个问题。问题代码以下:

var name = string.Format("Global\{0}", (object) 
Assembly.GetExecutingAssembly().GetType().GUID);

固然了,若是系统只有一个应用程序使用了上面的错误代码,那么这个问题仍是不会出现,由于只有一个实例。但实际状况是不少应用程序都使用了这一段错误代码,结果就不容许两个实例同时运行。

那这些应用程序,想必你已经猜到,都用了这段代码,并且都是从StackOverflow上下载后不假思索的使用致使的。

  • Andreas Lundblad,国外一位大神,Palantir 的 Java 开发人员,同时也是 StackOverflow 上排名最高的贡献者之一。

他有一段代码,做用是将字节计数转换为更易于阅读的格式。打个比方,1024字节转换为1kB,1048576 字节转换为1MB。他最初在2010年将这一段代码放到了StackOverflow上,根据官方统计,他的这段代码是StackOverflow上被拷贝次数最多的Java代码,GitHub上使用这段代码的项目有6千多个。

当Andreas Lundblad知道此过后,出于负责,很当心谨慎的从新检查了下这段代码,随后发现这段代码里有一些问题,因而他立刻更新了版本,并发博告诉你们:

  • StackOverflow 上的代码可能存在 bug,无论他的好评是多少。
  • 若是你拿了StackOverflow的代码,必定记住要测试全部的可能的状况。
  • 在复制代码时,必定要包括其来源和贡献者,当出问题时,能快速帮你定位。

一样的,在去年,国外另外一位大神Morteza Verdi发表了一篇研究论文指出,StackOverflow上流传最广的一段c++代码存在着69个重大安全隐患漏洞,GitHub上使用这段C++代码的项目也有近3千多个。

因此,不管是StackOverflow仍是CSDN,不管是国外和国内,都务必记住一点,在复用别人的代码时,必定要搞清楚别人代码的含义,并作好充分的测试工做,并非说你运行了一次没问题,就是真的没问题,可能只是你运气好,没有触发问题场景罢了。

引用 Ryan Donovan 的一句话,就是:

If you borrow things and you don’t understand the content of what you’re borrowing, then you fall in this trap of reusing code that has potential vulnerabilities. Then you are just spreading those things around.”

If you’re going to reuse code, you need to understand that code.

复用代码,必定要理解代码!

相关文章
相关标签/搜索