很多 Leader 向我传授职业经验时都说过「bug 是改不完的」,这代表什么含义?
1)软件bug是改不完的。这代表软件开发中的现实困境,就是现实中有很多无法解释的小概率bug存在,简单的在自己的代码中修改,是不可能解决的(一部分小概率bug的原因非常复杂,与cpu硬件和操作系统和第三方库,以及其它关联人员的代码等因素都有关系),下面这个回答里面提到了2个简单bug,都不是改自己的代码就可以修复的,也是持续多年无法修复的bug,也是顶级程序员给其他人制造的bug。
有哪些BUG是看起来很简单,但是处理起来极其麻烦的?现实中有很多常见的小概率bug,例如: 常见的app打开瞬间闪退。申请大量内存读写,在缺页中断瞬间闪崩。大型软件有很多长期无法找到也无法修复的bug,某个操作突然就崩了。典型的是codeblocks 这个百万行源码的开源IDE,作者群里面有很多c++专家级的高手,但是无论出多少个版本,依旧会在使用中每天遇到崩溃的bug。其中有一部分就是相关第三方库的小概率bug,作者很早就曾经提到过: linux下的个别bug是内存库造成的,所以无法修复。
我们重写了内存库,C++的稳定性问题有新的解决办法了,现在不用改一行代码,就可以直接通过外部接口修复一部分崩溃性问题。haisqlmalloc 内存库最近的版本已经在尝试默认主动修复一部分稳定性问题,以便改进C/C++的编程体验,例如: 解决了用户代码中某一小类常见的UAF问题(use after free),能够保证free后短期内继续错误使用这部分内存,不会有读写冲突(多线程下默认启用,库代码会暂时锁定这部分内存,不会重用),因此不会写到新创建的对象上,避免了UAF错误扩大化,避免出现类似野指针的严重后果,导致崩溃。减少了lock free代码中因为短期内重用同一块内存地址冲突导致的ABA问题,提升了有ABA 缺陷的lock free代码的稳定性。也彻底解决了缺页中断闪崩的小概率问题。haisqlmalloc内存库, 在容错设计上有很多代码,累计有几十项改进,实现更高的环境稳定性和容错性。因此,一些原先不稳定经常崩溃的一些C/C++程序,LD_PRELOAD加载最新版本的haisqlmalloc库,不用改一行代码,就可以修复一部分导致崩溃的问题,不会影响程序运行结果,也没有接管任何signal,也没有其它副作用,就可以长期稳定运行了。我自己就在长期使用 codeblocks 做稳定性测试,寻找导致其崩溃的问题,逐个彻底解决,没有改 codeblocks 一行代码,已经修复完了百万行源码的 codeblocks 多数导致崩溃的bug。一些新的软件底层稳定性代码非常有效,这部分主动修复一部分崩溃bug,主动提供更稳定的外部环境的基础代码的意义在于: if we win the battle, we win all the war。一次性永久解决一部分类型的崩溃bug。下面是内存库so的下载地址,欢迎测试。
郭忠明 (wlmqgzm) - Gitee.com2)软件是优化不完的。如果说性能低也是bug,那么,很快就会发现,性能bug也是解决不完的,性能优化也是没有止境的。例如: 我们写的内存库已经比google tcmalloc快了一个数量级,已经优化了两年多,但是依旧发现只要愿意继续花时间,那么继续每个月都能找到优化点,花时间的每个月都有1%以上的性能提升,现在的最新版本已经做到了5ns左右的小字节的申请和释放开销,在4KB场景下比ptmalloc有超过两个数量级的优势了(ptmalloc申请4KB大约1微秒)。跨线程释放,使用了最新的 wait free queue 的push和pop,在16线程并发下也做到了3ns左右的开销,比传统lock free方案也有数量级的性能优势了。总之,就是性能问题是永远解决不完的。
由于使用了太多前沿软件技术,一些新技术各大公司也都没有公开,加上中美脱钩,因此个人估计很长时间内(也许十年或者更长时间),在内存分配库这个小众领域内,公众不会见到能够与我们的内存库相媲美的竞品了(甚至连二进制的so文件也见不到)。(ps. 传说 google tcmalloc 内部版和目前大家常用的Linux开源版也有巨大的差异,大家常用的是古代阉割版,google内部 tcmalloc 版性能高,版本新,更稳定,也支持hugepage等cpu新特性,与常用开源版本也有N年的代差)。
以上