1.漏洞类型:内存泄漏_free()使用错误
代码段:
运行后报错。
原因与分析:
free()只能用来释放由用户动态分配的地址空间(堆内存),不能释放由系统维护的栈内存。
解决方法与思路:
(1)静态代码扫描。
2.漏洞类型:内存泄漏_重复释放内存
代码段:
运行后报错。
原因与分析:
第一次free时,已经将p所指的内存空间释放,所以完全有可能在第二次free前,p所指的内存空间又被重新分配,那么此时的free操作就是在影响其他程序的正常行为。
解决方法与思路:
(1)每次free后将指针置为NULL,free空指针并不会出现异常。
3.漏洞类型:内存泄漏_释放了错误的内存
代码段:
运行后报错。
原因与分析:
p所指的地址空间已经不再是系统所分配的地址空间,所以在释放过程中会访问其他地址空间,因而造成程序出错。一旦存有关键数据的地址被释放,就会造成内存泄漏。
解决方法与思路:
(1)从首地址开始释放内存
(2)保证至少有一个指针指向正确的地址,接着定义其他指针来操作内存。
4.漏洞类型:内存泄漏_引用已经释放的内容
代码段:
原因与分析:
使用了已经释放的指针,但编译器未做检查,从而使得指针指向了一个错误的位置,就是在访问一块已经被释放的,甚至可能被重新分配的地址空间,从而造成严重错误。
解决方法与思路:
(1)每次free后将指针指向NULL,每次使用指针指向指针前检查是否等于NULL。
5.漏洞类型:内存泄漏_使用后未释放内存
代码段:
原因与分析:
如果使用完后始终不释放p,那么内存中就有一块内存一直被占用。如果有大量的内存申请后未被释放,就会导致可用内存越来越少,设备运行越来越慢,最终导致设备无法正常运行。此外,由于内存始终未被释放,黑客也就可以直接读取该内存中的敏感数据,从而进一步实现攻击行为。
解决方法与思路:
(1)检查代码保证每块内存申请后必须被释放。
(2)配对使用malloc/free。
(3)设计程序结构,避免一块内存需要长期等待引用。
6.漏洞类型:内存泄漏_释放顺序出错
代码段:
原因与分析:
在释放动态申请的内存地址空间时,由于释放顺序出错造成的内存泄漏。如上代码段中,本应该先释放p->q再释放p,否则一旦释放p,就丢失了p->q所指空间的地址,也就造成了内存泄漏。如果有大量的内存申请后未被释放,就会导致可用内存越来越少,设备运行越来越慢,最终导致设备无法正常运行。此外,由于内存始终未被释放,黑客也就可以直接读取该内存中的敏感数据,从而进一步实现攻击行为。
解决方法与思路:
(1)检查内存释放顺序,按照先分配大空间再分配小空间,先释放小空间再释放大空间的原则。
7.漏洞类型:内存泄漏_未判断内存申请是否成功
代码段:
原因与分析:
计算机由于种种原因导致内存申请失败,但如果未做检查就引用指针p,显然会出错。
解决方法与分析:
(1)申请完后使用if(p!=NULL)来判断内存申请是否成功,如失败则不能引用指针p。
领取专属 10元无门槛券
私享最新 技术干货