平面缓冲区验证程序行为

Flatbuffers verifier behaviour

本文关键字:程序 验证 缓冲区 平面      更新时间:2023-10-16

如果这两个对象的模式中的表从相似的数据类型开始,有没有办法使用平面缓冲区验证器验证具有扁平缓冲结构的字节数组?

示例架构:

table AddTaskResponse{
    blablabla:int;
    foobar:int;
}
table AddTaskRequest{
    requestId:int;
    taskId:int;
    profileId:string;
}

我目前的实验告诉我:

flatbuffers::Verifier verifier(reinterpret_cast<unsigned char*>(data.data()),data.size());
bool isaddTaskResponse = VerifyAddTaskResponseBuffer(verifier);
bool isaddTaskRequest = VerifyAddTaskRequestBuffer(verifier);

布尔标志isaddTaskResponse和isaddTaskRequest都是真的,它们的真实状态不取决于我发送AddTaskResponseAddTaskRequest的实际结构。

验证器只是检查数据在结构上是否合理(没有偏移量超出界限),但缓冲区中没有关于类型的数据,所以是的,如果类型兼容,它将起作用。

在这种情况下,如果响应验证程序看到请求缓冲区,则认为它是来自架构未来版本的缓冲区(它有一个额外的字段,该字段将被忽略)。同样,如果请求验证程序看到响应缓冲区,它会认为它获得了旧版本的架构,因为缺少字段。

尽管这有效,但不建议这样做,因为它会使架构演变复杂化,并且您对实现做出了一些假设。您应该始终知道缓冲区的确切类型,无论是通过外部上下文还是内部(例如使用联合类型)。