Stop stripping the size prefix off
This turns out to be super dangerous to do. A flatbuffer is aligned
assuming that the size is either there or not there. By removing it,
you break alignment.
This necesitates having 2 subclasses of Flatbuffer. A SizePrefixed
version and a non size prefixed version. That lets us distinguish for
methods which care.
Once all that's done, deal with the fallout through the code base,
including logfile_utils and the chaos that causes rippling out.
Change-Id: I91b7be355279a1c19e5c956c33359df01a17eacf
diff --git a/aos/flatbuffer_merge_test.cc b/aos/flatbuffer_merge_test.cc
index 85773a3..4162edc 100644
--- a/aos/flatbuffer_merge_test.cc
+++ b/aos/flatbuffer_merge_test.cc
@@ -18,63 +18,59 @@
fbb.GetSize());
}
-std::string_view FromFbb(const flatbuffers::DetachedBuffer &b) {
- return std::string_view(reinterpret_cast<const char *>(b.data()), b.size());
-}
-
-absl::Span<const uint8_t> ToSpan(const flatbuffers::DetachedBuffer &b) {
- return absl::Span<const uint8_t>(b.data(), b.size());
+std::string_view FromFbb(const FlatbufferDetachedBuffer<Configuration> &b) {
+ return std::string_view(reinterpret_cast<const char *>(b.span().data()),
+ b.span().size());
}
class FlatbufferMerge : public ::testing::Test {
public:
FlatbufferMerge() {}
- void ExpectMergedOutput(const flatbuffers::DetachedBuffer &fb_merged,
- std::string_view expected_output) {
- ASSERT_NE(fb_merged.size(), 0u);
+ void ExpectMergedOutput(
+ const NonSizePrefixedFlatbuffer<Configuration> &fb_merged,
+ std::string_view expected_output) {
+ ASSERT_NE(fb_merged.span().size(), 0u);
- const ::std::string merged_output =
- FlatbufferToJson(fb_merged, ConfigurationTypeTable());
+ const ::std::string merged_output = FlatbufferToJson(fb_merged);
EXPECT_EQ(expected_output, merged_output);
aos::FlatbufferDetachedBuffer<Configuration> expected_message(
JsonToFlatbuffer(std::string(expected_output).c_str(),
ConfigurationTypeTable()));
EXPECT_TRUE(
- CompareFlatBuffer(flatbuffers::GetRoot<Configuration>(fb_merged.data()),
- &expected_message.message()));
+ CompareFlatBuffer(&fb_merged.message(), &expected_message.message()));
}
void JsonMerge(const ::std::string in1, const ::std::string in2,
const ::std::string out) {
- printf("Merging: %s\n", in1.c_str());
- printf("Merging: %s\n", in2.c_str());
- const flatbuffers::DetachedBuffer fb1 = JsonToFlatbuffer(
+ LOG(INFO) << "Merging: " << in1.c_str();
+ LOG(INFO) << "Merging: " << in2.c_str();
+ const FlatbufferDetachedBuffer<Configuration> fb1 = JsonToFlatbuffer(
static_cast<const char *>(in1.c_str()), ConfigurationTypeTable());
const ::std::string in1_nested = "{ \"nested_config\": " + in1 + " }";
- const flatbuffers::DetachedBuffer fb1_nested =
+ const FlatbufferDetachedBuffer<Configuration> fb1_nested =
JsonToFlatbuffer(static_cast<const char *>(in1_nested.c_str()),
ConfigurationTypeTable());
- const flatbuffers::DetachedBuffer fb2 = JsonToFlatbuffer(
+ const FlatbufferDetachedBuffer<Configuration> fb2 = JsonToFlatbuffer(
static_cast<const char *>(in2.c_str()), ConfigurationTypeTable());
const ::std::string in2_nested = "{ \"nested_config\": " + in2 + " }";
- const flatbuffers::DetachedBuffer fb2_nested =
+ const FlatbufferDetachedBuffer<Configuration> fb2_nested =
JsonToFlatbuffer(static_cast<const char *>(in2_nested.c_str()),
ConfigurationTypeTable());
const ::std::string out_nested = "{ \"nested_config\": " + out + " }";
- const flatbuffers::DetachedBuffer empty =
+ const FlatbufferDetachedBuffer<Configuration> empty =
JsonToFlatbuffer("{ }", ConfigurationTypeTable());
- ASSERT_NE(fb1.size(), 0u);
- ASSERT_NE(fb2.size(), 0u);
- ASSERT_NE(fb1_nested.size(), 0u);
- ASSERT_NE(fb2_nested.size(), 0u);
+ ASSERT_NE(fb1.span().size(), 0u);
+ ASSERT_NE(fb2.span().size(), 0u);
+ ASSERT_NE(fb1_nested.span().size(), 0u);
+ ASSERT_NE(fb2_nested.span().size(), 0u);
// We now want to run 7 tests.
// in1 merged "" -> in1.
@@ -87,167 +83,154 @@
{
// in1 merged with "" => in1.
- flatbuffers::DetachedBuffer fb_merged =
- MergeFlatBuffers<Configuration>(fb1.data(), empty.data());
- ASSERT_NE(fb_merged.size(), 0u);
+ FlatbufferDetachedBuffer<Configuration> fb_merged =
+ MergeFlatBuffers<Configuration>(fb1, empty);
+ ASSERT_NE(fb_merged.span().size(), 0u);
- EXPECT_EQ(in1, FlatbufferToJson(fb_merged, ConfigurationTypeTable()));
+ EXPECT_EQ(in1, FlatbufferToJson(fb_merged));
}
{
// in2 merged with "" => in2.
- flatbuffers::DetachedBuffer fb_merged =
- MergeFlatBuffers<Configuration>(fb2.data(), empty.data());
- ASSERT_NE(fb_merged.size(), 0u);
+ FlatbufferDetachedBuffer<Configuration> fb_merged =
+ MergeFlatBuffers<Configuration>(fb2, empty);
+ ASSERT_NE(fb_merged.span().size(), 0u);
- EXPECT_EQ(in2, FlatbufferToJson(fb_merged, ConfigurationTypeTable()));
+ EXPECT_EQ(in2, FlatbufferToJson(fb_merged));
}
{
// "" merged with in1 => in1.
- flatbuffers::DetachedBuffer fb_merged =
- MergeFlatBuffers<Configuration>(empty.data(), fb1.data());
- ASSERT_NE(fb_merged.size(), 0u);
+ FlatbufferDetachedBuffer<Configuration> fb_merged =
+ MergeFlatBuffers<Configuration>(empty, fb1);
+ ASSERT_NE(fb_merged.span().size(), 0u);
- EXPECT_EQ(in1, FlatbufferToJson(fb_merged, ConfigurationTypeTable()));
+ EXPECT_EQ(in1, FlatbufferToJson(fb_merged));
}
{
// "" merged with in2 => in2.
- flatbuffers::DetachedBuffer fb_merged =
- MergeFlatBuffers<Configuration>(empty.data(), fb2.data());
- ASSERT_NE(fb_merged.size(), 0u);
+ FlatbufferDetachedBuffer<Configuration> fb_merged =
+ MergeFlatBuffers<Configuration>(empty, fb2);
+ ASSERT_NE(fb_merged.span().size(), 0u);
- EXPECT_EQ(in2, FlatbufferToJson(fb_merged, ConfigurationTypeTable()));
+ EXPECT_EQ(in2, FlatbufferToJson(fb_merged));
}
{
// nullptr merged with in1 => in1.
- flatbuffers::DetachedBuffer fb_merged =
- MergeFlatBuffers<Configuration>(nullptr, fb1.data());
- ASSERT_NE(fb_merged.size(), 0u);
+ FlatbufferDetachedBuffer<Configuration> fb_merged =
+ MergeFlatBuffers<Configuration>(nullptr, &fb1.message());
+ ASSERT_NE(fb_merged.span().size(), 0u);
- EXPECT_EQ(in1, FlatbufferToJson(fb_merged, ConfigurationTypeTable()));
+ EXPECT_EQ(in1, FlatbufferToJson(fb_merged));
}
{
// in1 merged with nullptr => in1.
- flatbuffers::DetachedBuffer fb_merged =
- MergeFlatBuffers<Configuration>(fb1.data(), nullptr);
- ASSERT_NE(fb_merged.size(), 0u);
+ FlatbufferDetachedBuffer<Configuration> fb_merged =
+ MergeFlatBuffers<Configuration>(&fb1.message(), nullptr);
+ ASSERT_NE(fb_merged.span().size(), 0u);
- EXPECT_EQ(in1, FlatbufferToJson(fb_merged, ConfigurationTypeTable()));
+ EXPECT_EQ(in1, FlatbufferToJson(fb_merged));
}
{
// in1 merged with in2 => out.
- flatbuffers::DetachedBuffer fb_merged =
- MergeFlatBuffers<Configuration>(fb1.data(), fb2.data());
+ FlatbufferDetachedBuffer<Configuration> fb_merged =
+ MergeFlatBuffers<Configuration>(fb1, fb2);
ExpectMergedOutput(fb_merged, out);
}
// Test all the different merge methods:
- ExpectMergedOutput(
- MergeFlatBuffers(ConfigurationTypeTable(), fb1.data(), fb2.data()),
- out);
+ ExpectMergedOutput(MergeFlatBuffers<Configuration>(fb1, fb2), out);
{
flatbuffers::FlatBufferBuilder fbb;
fbb.ForceDefaults(true);
fbb.Finish(MergeFlatBuffers(
ConfigurationTypeTable(),
- flatbuffers::GetRoot<flatbuffers::Table>(fb1.data()),
- flatbuffers::GetRoot<flatbuffers::Table>(fb2.data()), &fbb));
- ExpectMergedOutput(fbb.Release(), out);
+ reinterpret_cast<const flatbuffers::Table *>(&fb1.message()),
+ reinterpret_cast<const flatbuffers::Table *>(&fb2.message()), &fbb));
+ FlatbufferDetachedBuffer<Configuration> fb(fbb.Release());
+ ExpectMergedOutput(fb, out);
}
{
flatbuffers::FlatBufferBuilder fbb;
fbb.ForceDefaults(true);
- fbb.Finish(MergeFlatBuffers<Configuration>(
- flatbuffers::GetRoot<flatbuffers::Table>(fb1.data()),
- flatbuffers::GetRoot<flatbuffers::Table>(fb2.data()), &fbb));
- ExpectMergedOutput(fbb.Release(), out);
+ fbb.Finish(MergeFlatBuffers<Configuration>(&fb1.message(), &fb2.message(),
+ &fbb));
+ FlatbufferDetachedBuffer<Configuration> fb(fbb.Release());
+ ExpectMergedOutput(fb, out);
}
- ExpectMergedOutput(MergeFlatBuffers<Configuration>(fb1.data(), fb2.data()),
- out);
+ ExpectMergedOutput(
+ MergeFlatBuffers<Configuration>(&fb1.message(), &fb2.message()), out);
ExpectMergedOutput(MergeFlatBuffers<Configuration>(fb1, fb2), out);
- ExpectMergedOutput(MergeFlatBuffers<Configuration>(
- flatbuffers::GetRoot<Configuration>(fb1.data()),
- flatbuffers::GetRoot<Configuration>(fb2.data()))
- .buffer(),
- out);
// Now, to make things extra exciting, nest a config inside a config. And
// run all the tests. This will exercise some fun nested merges and copies.
{
// in1_nested merged with "" => in1.
- flatbuffers::DetachedBuffer fb_merged =
- MergeFlatBuffers<Configuration>(fb1_nested.data(), empty.data());
- ASSERT_NE(fb_merged.size(), 0u);
+ FlatbufferDetachedBuffer<Configuration> fb_merged =
+ MergeFlatBuffers<Configuration>(fb1_nested, empty);
+ ASSERT_NE(fb_merged.span().size(), 0u);
- EXPECT_EQ(in1_nested,
- FlatbufferToJson(fb_merged, ConfigurationTypeTable()));
+ EXPECT_EQ(in1_nested, FlatbufferToJson(fb_merged));
}
{
// in2_nested merged with "" => in2_nested.
- flatbuffers::DetachedBuffer fb_merged =
- MergeFlatBuffers<Configuration>(fb2_nested.data(), empty.data());
- ASSERT_NE(fb_merged.size(), 0u);
+ FlatbufferDetachedBuffer<Configuration> fb_merged =
+ MergeFlatBuffers<Configuration>(fb2_nested, empty);
+ ASSERT_NE(fb_merged.span().size(), 0u);
- EXPECT_EQ(in2_nested,
- FlatbufferToJson(fb_merged, ConfigurationTypeTable()));
+ EXPECT_EQ(in2_nested, FlatbufferToJson(fb_merged));
}
{
// "" merged with in1_nested => in1_nested.
- flatbuffers::DetachedBuffer fb_merged =
- MergeFlatBuffers<Configuration>(empty.data(), fb1_nested.data());
- ASSERT_NE(fb_merged.size(), 0u);
+ FlatbufferDetachedBuffer<Configuration> fb_merged =
+ MergeFlatBuffers<Configuration>(empty, fb1_nested);
+ ASSERT_NE(fb_merged.span().size(), 0u);
- EXPECT_EQ(in1_nested,
- FlatbufferToJson(fb_merged, ConfigurationTypeTable()));
+ EXPECT_EQ(in1_nested, FlatbufferToJson(fb_merged));
}
{
// "" merged with in2_nested => in2_nested.
- flatbuffers::DetachedBuffer fb_merged =
- MergeFlatBuffers<Configuration>(empty.data(), fb2_nested.data());
- ASSERT_NE(fb_merged.size(), 0u);
+ FlatbufferDetachedBuffer<Configuration> fb_merged =
+ MergeFlatBuffers<Configuration>(empty, fb2_nested);
+ ASSERT_NE(fb_merged.span().size(), 0u);
- EXPECT_EQ(in2_nested,
- FlatbufferToJson(fb_merged, ConfigurationTypeTable()));
+ EXPECT_EQ(in2_nested, FlatbufferToJson(fb_merged));
}
{
// nullptr merged with in1_nested => in1_nested.
- flatbuffers::DetachedBuffer fb_merged =
- MergeFlatBuffers<Configuration>(nullptr, fb1_nested.data());
- ASSERT_NE(fb_merged.size(), 0u);
+ FlatbufferDetachedBuffer<Configuration> fb_merged =
+ MergeFlatBuffers<Configuration>(nullptr, &fb1_nested.message());
+ ASSERT_NE(fb_merged.span().size(), 0u);
- EXPECT_EQ(in1_nested,
- FlatbufferToJson(fb_merged, ConfigurationTypeTable()));
+ EXPECT_EQ(in1_nested, FlatbufferToJson(fb_merged));
}
{
// nullptr merged with in1_nested => in1_nested.
- flatbuffers::DetachedBuffer fb_merged =
- MergeFlatBuffers<Configuration>(fb1_nested.data(), nullptr);
- ASSERT_NE(fb_merged.size(), 0u);
+ FlatbufferDetachedBuffer<Configuration> fb_merged(
+ MergeFlatBuffers<Configuration>(&fb1_nested.message(), nullptr));
+ ASSERT_NE(fb_merged.span().size(), 0u);
- EXPECT_EQ(in1_nested,
- FlatbufferToJson(fb_merged, ConfigurationTypeTable()));
+ EXPECT_EQ(in1_nested, FlatbufferToJson(fb_merged));
}
{
// in1_nested merged with in2_nested => out_nested.
- flatbuffers::DetachedBuffer fb_merged =
- MergeFlatBuffers<Configuration>(fb1_nested, fb2_nested);
- ASSERT_NE(fb_merged.size(), 0u);
+ FlatbufferDetachedBuffer<Configuration> fb_merged(
+ MergeFlatBuffers<Configuration>(fb1_nested, fb2_nested));
+ ASSERT_NE(fb_merged.span().size(), 0u);
- EXPECT_EQ(out_nested,
- FlatbufferToJson(fb_merged, ConfigurationTypeTable()));
+ EXPECT_EQ(out_nested, FlatbufferToJson(fb_merged));
}
// TODO(austin): Try more flatbuffers...
@@ -258,19 +241,16 @@
LOG(INFO) << "Copying " << in1 << " "
<< absl::BytesToHexString(FromFbb(fb1)) << " at "
- << reinterpret_cast<const void *>(fb1.data()) << " size "
- << fb1.size();
+ << reinterpret_cast<const void *>(fb1.span().data()) << " size "
+ << fb1.span().size();
aos_flatbuffer_copy_fbb.Finish(CopyFlatBuffer<Configuration>(
- flatbuffers::GetRoot<Configuration>(fb1.data()),
- &aos_flatbuffer_copy_fbb));
+ &fb1.message(), &aos_flatbuffer_copy_fbb));
- aos::FlatbufferDetachedBuffer<Configuration> fb_copy(
+ const aos::FlatbufferDetachedBuffer<Configuration> fb_copy(
aos_flatbuffer_copy_fbb.Release());
- ASSERT_NE(fb_copy.size(), 0u);
+ ASSERT_NE(fb_copy.span().size(), 0u);
- flatbuffers::Verifier v(fb1.data(), fb1.size());
- EXPECT_TRUE(
- v.VerifyTable(flatbuffers::GetRoot<Configuration>(fb1.data())));
+ EXPECT_TRUE(fb1.Verify());
ASSERT_TRUE(fb_copy.Verify()) << in1;
@@ -282,27 +262,24 @@
aos_flatbuffer_copy_message_ptr_fbb.ForceDefaults(true);
aos_flatbuffer_copy_message_ptr_fbb.Finish(CopyFlatBuffer<Configuration>(
- flatbuffers::GetRoot<Configuration>(fb2.data()),
- &aos_flatbuffer_copy_message_ptr_fbb));
+ &fb2.message(), &aos_flatbuffer_copy_message_ptr_fbb));
aos::FlatbufferDetachedBuffer<Configuration> fb_copy_message_ptr(
aos_flatbuffer_copy_message_ptr_fbb.Release());
- ASSERT_NE(fb_copy_message_ptr.size(), 0u);
+ ASSERT_NE(fb_copy_message_ptr.span().size(), 0u);
flatbuffers::FlatBufferBuilder aos_flatbuffer_copy_full_fbb;
aos_flatbuffer_copy_full_fbb.ForceDefaults(true);
aos_flatbuffer_copy_full_fbb.Finish(BlindCopyFlatBuffer<Configuration>(
- aos::FlatbufferSpan<Configuration>(ToSpan(fb2)),
+ aos::FlatbufferSpan<Configuration>(fb2.span()),
&aos_flatbuffer_copy_full_fbb));
aos::FlatbufferDetachedBuffer<Configuration> fb_copy_full(
aos_flatbuffer_copy_full_fbb.Release());
- ASSERT_NE(fb_copy_full.size(), 0u);
+ ASSERT_NE(fb_copy_full.span().size(), 0u);
- flatbuffers::Verifier v(fb2.data(), fb2.size());
- EXPECT_TRUE(
- v.VerifyTable(flatbuffers::GetRoot<Configuration>(fb2.data())));
+ EXPECT_TRUE(fb2.Verify());
LOG(INFO) << "Verifying copy of " << in2;
ASSERT_TRUE(fb_copy_message_ptr.Verify()) << in2;
@@ -318,12 +295,11 @@
aos_flatbuffer_copy_fbb.ForceDefaults(true);
aos_flatbuffer_copy_fbb.Finish(CopyFlatBuffer<Configuration>(
- flatbuffers::GetRoot<Configuration>(fb1_nested.data()),
- &aos_flatbuffer_copy_fbb));
+ &fb1_nested.message(), &aos_flatbuffer_copy_fbb));
aos::FlatbufferDetachedBuffer<Configuration> fb_copy(
aos_flatbuffer_copy_fbb.Release());
- ASSERT_NE(fb_copy.size(), 0u);
+ ASSERT_NE(fb_copy.span().size(), 0u);
ASSERT_TRUE(fb_copy.Verify());
@@ -335,12 +311,11 @@
aos_flatbuffer_copy_fbb.ForceDefaults(true);
aos_flatbuffer_copy_fbb.Finish(CopyFlatBuffer<Configuration>(
- flatbuffers::GetRoot<Configuration>(fb2_nested.data()),
- &aos_flatbuffer_copy_fbb));
+ &fb2_nested.message(), &aos_flatbuffer_copy_fbb));
aos::FlatbufferDetachedBuffer<Configuration> fb_copy(
aos_flatbuffer_copy_fbb.Release());
- ASSERT_NE(fb_copy.size(), 0u);
+ ASSERT_NE(fb_copy.span().size(), 0u);
ASSERT_TRUE(fb_copy.Verify());