google/flatbuffers

FlatBufferBuilder (in C++ and possibly other languages) should consider aligning empty vectors to `T`.

Opened this issue · 1 comments

Issue originally discovered here: dvidelabs/flatcc#287
(please read that fully for details).

The short of it is that a [T] (where sizeof(T) > 4, e.g. double) has so far always been aligned to 4 (for the size field) in the specific case of empty vectors.

This may seem benign since there is no T element to access, but at least in C/C++ this generates unaligned pointers (when calling e.g. Vector::data() whose mere existence, even if never accessed, can be undefined behavior (C) or generate an unspecified value (C++). While in practice no compiler/hardware causes trouble with this (currently), for the long term correctness of FlatBuffers it may be better to also align to T as the code originally intended.

Verifiers and other code must however always work with these unaligned empty vectors given how much data & code is in the wild.

For details of what that would entail, again, see above link.

I just wanted to add that unaligned empty vectors means vectors aligned to size 4 because the size field requires that alignment, and for what we know by now, the issue is only above 4. Hence verifiers should still require at least 4 bytes alignment.