有这样一种消息包:在一段buffer的开头要记录消息内容的长度,但是内容是分散在各个系统中分别填充的,只有在所有系统填充完毕后才能知道真正的长度。
于是会采用这样一种做法:在buffer头先预留4个字节,等包内容填充完毕后再修改这个值。
但是如果是通过记录下buffer头部指针的方式来后续修改消息长度值,需要确保buffer在整个填写的过程中不会被扩充,
最典型的例子是vetcor在执行push_back操作时,有可能会将整段内存重新分配。而本次宕机用到的EvMemoryStream也是可变长的结构,在超过512字节后会重新分配内存。在线上的代码中,记录的buffer指针在MemoryStream扩充时变成了无效地址,继续修改指针位置的值时破坏了系统内存。但是程序并没有立即宕机,而是在后续尝试分配新内存时发生错误。这也是一种典型的非当前代码错误的宕机堆栈。