最近被老项目的一些问题折腾得不轻,同事也都吐槽要不是大客户,他们连代码都不想同步到本地。
这个项目从bug菌来的时候就已经开发了好几年了,早期团队较小,估计软件上也没怎么管理,人员也是换了一批又一批,工程之大,功能之多,现在拿出来基本都是公认的”屎山”了,那块业务也没咋做了,都不想再花人力再去重构,那就只能大家有时间的修修bug加一些简单的需求了,不过C语言的有些bug可真不好找。
大家都知道C语言是非常高效的一门编程语言,像linux内核都是C语言来开发的,在嵌入式开发中C语言目前还是主流,虽然也受到了一些其他新型编程语言的冲击,但很多取舍都是一种折中的方案,毕竟熊掌和鱼不可兼得。
C语言是一种内存不安全的编程语言,然而C语言的优势却又于程序员可以直接操作内存带来的高效,这就让很多人在原则上处于一种矛盾状态,其实完全没有必要纠结,没有完美的编程语言,只有是否满足你现在的需求。
当然由于C或者C++的广泛应用,有调查显示,70%比例的漏洞和bug都来源于内存安全问题。这也让很多人在开发语言的选择上进行了深入地考量。
说白了还是因为C语言在对内存管理和访问方面的自由度和灵活度太高了,操作的权限范围太大。一份C语言代码的高效、稳定、可靠、健壮很大程度上都取决于所编写代码工程师的水平。
当然除了程序员通过自身经验在编码中去识别,也有非常多的软件分析工具会自动检出大部分内存管理问题,并且操作系统也会在中间层提供部分保护,但相对那些内存安全的编程语言比,如Python,Java, C#, Go,以及扬言要取代C的Rust,他们可以自动管理内存,不依赖于程序员添加措施进行保护,编译和运行时都会进行检查和保护。
当然编程语言通过固有的保护和缓解措施建立的安全程度各不相同。有些语言只提供相对最低的内存安全性,而有些语言非常严格,通过控制内存的分配、访问和管理方式提供了较大的保护,所以相比之下C在内存安全等级较低。
内存泄漏,数据篡改、内存缓存区溢出、随机的程序奔溃、程序执行指令被异常修改等等都是C语言开发工程师们经常要面对的头皮发麻的问题。
而且通过利用这些类型的内存问题,恶意攻击者可能会发现他们向程序中输入异常,导致内存以意想不到的方式被访问、写入、分配或释放。利用这些内存管理错误来访问敏感信息、执行未经授权的代码或造成其他负面影响。
当然由于可能需要对异常输入进行大量实验才能找到导致意外响应的输入,参与者会使用一种模糊测试技术,随机或智能地为程序制作大量输入值,直到找到导致程序崩溃的输入值,最终拿到想要的破译结果。
所以在一个非常庞大的C语言代码,如果早期就比较混乱,后面维护人员的技术功底不扎实,必定会使得后面莫名其妙的问题越多;最终只能走上一条重构之路。
转自最后一个bug |