本文转载自知乎:https://zhuanlan.zhihu.com/p/137907908
作者:Kevin Wang
前几天,我发了一篇文章记录了我用Rust重写一个Linux内核模块的一些重点体验,没想到引起不少人关注。由于第一次写文章,一些背景没有详细介绍,只专注于写我想的东西了,导致一些不了解Rust的人表示有些担心,因此,我在这里我补充介绍一点儿背景。
TOC:
没有找到原软件BUG的根因,就贸然用Rust重写,合适吗?
用Rust重写的代价大吗?相比用C如何?
Rust这种【高级语言】会不会运行性能差,附加开销大?
没有找到原软件BUG的根因,就贸然用Rust重写,合适吗?
由于我们的产品绝大部分采用C语言开发,因此,我们一直被C写出的内存安全问题所困扰。一些影响较大的故障,会导致各方面的人员高度紧张。我们开发人员要面对就是一旦有紧急情况发生,老道的“专家”们就被召集过来,不管你是在岗还是休息,都要爬到屏幕面前分析解决。基本每年都会有一些这种情况,我就这样陆续被折磨了十年。
印象最深的一次是我在另一个项目开发攻关的最后一天,通宵到第二天9点,刚上床躺下,就接到领导电话,说我们一个重要客户的设备紧急故障,“专家组”其他人已经分析了一阵了,我不得不强行打起精神回到办公室。经过大家将近一天的努力,初步找到了bug原因,就是我本次重写的这个内核模块中的某处内存安全问题导致,与此同时我们另一路人马正在奔赴他乡故障现场的路上......。这个已经算是众多安全问题相对较好分析定位的了。
复杂系统中,C语言的内存安全问题远没有许多人想象的那么简单,通过开发人员的素质培训、良好的测试、费尽心思发明的各种调试方法的确能解决的大部分的安全问题。但是始终会剩下那一小部分,如梦魇般伴随我们的每一天。每当到达一个新的战场,她们少则十天半月、多则几个月冒出头来给我们沉重一击,她们当中有些很聪明,从不光顾我们的测试环境和实验环境。
难查的故障这次再一次光临,我和另一个同事分析了几天,没有准确定位原因,看到代码里一些内存问题,重构起来改动也非常大,怕改出其它问题。根据故障现象,我们只能得出一个结论: 这是内存安全问题导致的。而事情又紧急,以至于我们不得不启用了plan B为客户解决了问题,公司付出了代价、对于开发人员来讲是比较丢脸的事。
问题现场得到缓解之后,按理说我们有足够的时间来分析解决这个故障,但是,我们真的要这样年复一年的继续下去吗?即使我们再花一两周时间解决了这个疑难,梦魇仍然不会结束,或许下个月、明年下一个再次光顾。我想,我们需要解决掉这个"根本原因" --