例如,客户端序列化
std::vector
、std::unordered_map
、boost::optional
、std::shared_ptr
或其他序列化机制直接在 Boost 中布局的类型,然后将其发送到服务器。服务器接收此数据包并将其反序列化,如有必要,捕获 boost::archive::archive_exception
并丢弃该数据包。
这种方法是否能保证服务器在尝试反序列化时(在 try 块内)或之后使用反序列化结构时不会因某些
SIGSEGV
而崩溃,即使客户端上的人非常努力?c++
不,没有任何保证。
如果你有
vector<int>
那么它不会崩溃,因为它的内容是简单可构造的,错误的大小会抛出异常,对于其他容器也是如此,但是如果你有 vector<CustomClass>
,你的 CustomClass
构造函数或反序列化函数可能崩溃然后它就会崩溃。
也不能保证
vector<int>
或 vector<CustomClass>
的内容是正确的,它们可以被篡改,唯一的保证是一旦函数返回,您将拥有一个有效的 std::vector
,即:如果它的大小是 1 那么你可以访问第一个元素而不会崩溃。
您需要为自定义类型编写安全的反序列化代码,并且需要在反序列化后验证对象是否包含有效数据。