之所以花了大量的篇幅讲这样一个故事,是因为它透露出我觉得非常重要的几点: 缓冲区越界通常发生在程序中某个部分A分配内存,而实际需要的存储空间大小只有另一个部分B知道。 在程序中的同一个函数内部分配内存,并将其填充。这种方式解决了缓冲区分配的问题,而付出的代价是必须要让程序的另一个函数负责内存的释放。内存的分配和释放在程序的两个不同的函数中。 这种分配和释放在两个不同的函数将会导致程序的可用性问题,除非在编程语言上有系统的支持,否则很难绕开。 即使用户为了安全和通用性,需要接收这个现实,但是他们可能也无法接受动态分配内存引入的开销。 我想,程序员不愿为了安全而引入运行时开销,是很多安全性问题之所以普遍存在的原因。 我们将在下周详细聊聊这种现象。 |