mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-05 21:17:25 +00:00
Enable verifier on nested_flatbuffers
This commit is contained in:
@@ -183,6 +183,14 @@ class Verifier FLATBUFFERS_FINAL_CLASS {
|
||||
// clang-format on
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
bool VerifyNestedFlatBuffer(const Vector<uint8_t> *buf,
|
||||
const char *identifier) {
|
||||
if (!buf) return true;
|
||||
Verifier nested_verifier(buf->data(), buf->size());
|
||||
return nested_verifier.VerifyBuffer<T>(identifier);
|
||||
}
|
||||
|
||||
// Verify this whole buffer, starting with root type T.
|
||||
template<typename T> bool VerifyBuffer() { return VerifyBuffer<T>(nullptr); }
|
||||
|
||||
|
||||
@@ -1999,6 +1999,14 @@ class CppGenerator : public BaseGenerator {
|
||||
}
|
||||
default: break;
|
||||
}
|
||||
|
||||
auto nfn = GetNestedFlatBufferName(field);
|
||||
if (!nfn.empty()) {
|
||||
code_.SetValue("CPP_NAME", nfn);
|
||||
// FIXME: file_identifier.
|
||||
code_ += "{{PRE}}verifier.VerifyNestedFlatBuffer<{{CPP_NAME}}>"
|
||||
"({{NAME}}(), nullptr)\\";
|
||||
}
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
@@ -2294,6 +2302,21 @@ class CppGenerator : public BaseGenerator {
|
||||
}
|
||||
}
|
||||
|
||||
std::string GetNestedFlatBufferName(const FieldDef &field) {
|
||||
auto nested = field.attributes.Lookup("nested_flatbuffer");
|
||||
if (!nested) return "";
|
||||
std::string qualified_name = nested->constant;
|
||||
auto nested_root = parser_.LookupStruct(nested->constant);
|
||||
if (nested_root == nullptr) {
|
||||
qualified_name =
|
||||
parser_.current_namespace_->GetFullyQualifiedName(nested->constant);
|
||||
nested_root = parser_.LookupStruct(qualified_name);
|
||||
}
|
||||
FLATBUFFERS_ASSERT(nested_root); // Guaranteed to exist by parser.
|
||||
(void)nested_root;
|
||||
return TranslateNameSpace(qualified_name);
|
||||
}
|
||||
|
||||
// Generate an accessor struct, builder structs & function for a table.
|
||||
void GenTable(const StructDef &struct_def) {
|
||||
if (opts_.generate_object_based_api) { GenNativeTable(struct_def); }
|
||||
@@ -2357,19 +2380,9 @@ class CppGenerator : public BaseGenerator {
|
||||
GenTableFieldGetter(field);
|
||||
if (opts_.mutable_buffer) { GenTableFieldSetter(field); }
|
||||
|
||||
auto nested = field.attributes.Lookup("nested_flatbuffer");
|
||||
if (nested) {
|
||||
std::string qualified_name = nested->constant;
|
||||
auto nested_root = parser_.LookupStruct(nested->constant);
|
||||
if (nested_root == nullptr) {
|
||||
qualified_name = parser_.current_namespace_->GetFullyQualifiedName(
|
||||
nested->constant);
|
||||
nested_root = parser_.LookupStruct(qualified_name);
|
||||
}
|
||||
FLATBUFFERS_ASSERT(nested_root); // Guaranteed to exist by parser.
|
||||
(void)nested_root;
|
||||
code_.SetValue("CPP_NAME", TranslateNameSpace(qualified_name));
|
||||
|
||||
auto nfn = GetNestedFlatBufferName(field);
|
||||
if (!nfn.empty()) {
|
||||
code_.SetValue("CPP_NAME", nfn);
|
||||
code_ += " const {{CPP_NAME}} *{{FIELD_NAME}}_nested_root() const {";
|
||||
code_ +=
|
||||
" return "
|
||||
|
||||
@@ -1716,6 +1716,7 @@ struct Monster FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
|
||||
verifier.VerifyTable(enemy()) &&
|
||||
VerifyOffset(verifier, VT_TESTNESTEDFLATBUFFER) &&
|
||||
verifier.VerifyVector(testnestedflatbuffer()) &&
|
||||
verifier.VerifyNestedFlatBuffer<MyGame::Example::Monster>(testnestedflatbuffer(), nullptr) &&
|
||||
VerifyOffset(verifier, VT_TESTEMPTY) &&
|
||||
verifier.VerifyTable(testempty()) &&
|
||||
VerifyField<uint8_t>(verifier, VT_TESTBOOL) &&
|
||||
@@ -1773,6 +1774,7 @@ struct Monster FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
|
||||
VerifyField<int8_t>(verifier, VT_SIGNED_ENUM) &&
|
||||
VerifyOffset(verifier, VT_TESTREQUIREDNESTEDFLATBUFFER) &&
|
||||
verifier.VerifyVector(testrequirednestedflatbuffer()) &&
|
||||
verifier.VerifyNestedFlatBuffer<MyGame::Example::Monster>(testrequirednestedflatbuffer(), nullptr) &&
|
||||
VerifyOffset(verifier, VT_SCALAR_KEY_SORTED_TABLES) &&
|
||||
verifier.VerifyVector(scalar_key_sorted_tables()) &&
|
||||
verifier.VerifyVectorOfTables(scalar_key_sorted_tables()) &&
|
||||
|
||||
@@ -82,7 +82,6 @@ std::string do_test(const flatbuffers::IDLOptions &opts,
|
||||
TEST_EQ(true, MyGame::Example::VerifyMonsterBuffer(verifier));
|
||||
// FIXME: these are currently not being properly verified, so turn them off
|
||||
// for fuzzing until they are.
|
||||
parser.opts.json_nested_flatbuffers = false;
|
||||
parser.opts.json_nested_flexbuffers = false;
|
||||
TEST_ASSERT(
|
||||
GenerateText(parser, parser.builder_.GetBufferPointer(), &jsongen));
|
||||
|
||||
@@ -1656,6 +1656,7 @@ struct Monster FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
|
||||
verifier.VerifyTable(enemy()) &&
|
||||
VerifyOffset(verifier, VT_TESTNESTEDFLATBUFFER) &&
|
||||
verifier.VerifyVector(testnestedflatbuffer()) &&
|
||||
verifier.VerifyNestedFlatBuffer<MyGame::Example::Monster>(testnestedflatbuffer(), nullptr) &&
|
||||
VerifyOffset(verifier, VT_TESTEMPTY) &&
|
||||
verifier.VerifyTable(testempty()) &&
|
||||
VerifyField<uint8_t>(verifier, VT_TESTBOOL) &&
|
||||
@@ -1713,6 +1714,7 @@ struct Monster FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
|
||||
VerifyField<int8_t>(verifier, VT_SIGNED_ENUM) &&
|
||||
VerifyOffset(verifier, VT_TESTREQUIREDNESTEDFLATBUFFER) &&
|
||||
verifier.VerifyVector(testrequirednestedflatbuffer()) &&
|
||||
verifier.VerifyNestedFlatBuffer<MyGame::Example::Monster>(testrequirednestedflatbuffer(), nullptr) &&
|
||||
VerifyOffset(verifier, VT_SCALAR_KEY_SORTED_TABLES) &&
|
||||
verifier.VerifyVector(scalar_key_sorted_tables()) &&
|
||||
verifier.VerifyVectorOfTables(scalar_key_sorted_tables()) &&
|
||||
|
||||
Reference in New Issue
Block a user