mirror of
https://github.com/google/flatbuffers.git
synced 2026-07-01 16:53:57 +00:00
Enable verifier on nested_flatbuffers
This commit is contained in:
@@ -183,6 +183,14 @@ class Verifier FLATBUFFERS_FINAL_CLASS {
|
|||||||
// clang-format on
|
// 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.
|
// Verify this whole buffer, starting with root type T.
|
||||||
template<typename T> bool VerifyBuffer() { return VerifyBuffer<T>(nullptr); }
|
template<typename T> bool VerifyBuffer() { return VerifyBuffer<T>(nullptr); }
|
||||||
|
|
||||||
|
|||||||
@@ -1999,6 +1999,14 @@ class CppGenerator : public BaseGenerator {
|
|||||||
}
|
}
|
||||||
default: break;
|
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;
|
break;
|
||||||
}
|
}
|
||||||
default: {
|
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.
|
// Generate an accessor struct, builder structs & function for a table.
|
||||||
void GenTable(const StructDef &struct_def) {
|
void GenTable(const StructDef &struct_def) {
|
||||||
if (opts_.generate_object_based_api) { GenNativeTable(struct_def); }
|
if (opts_.generate_object_based_api) { GenNativeTable(struct_def); }
|
||||||
@@ -2357,19 +2380,9 @@ class CppGenerator : public BaseGenerator {
|
|||||||
GenTableFieldGetter(field);
|
GenTableFieldGetter(field);
|
||||||
if (opts_.mutable_buffer) { GenTableFieldSetter(field); }
|
if (opts_.mutable_buffer) { GenTableFieldSetter(field); }
|
||||||
|
|
||||||
auto nested = field.attributes.Lookup("nested_flatbuffer");
|
auto nfn = GetNestedFlatBufferName(field);
|
||||||
if (nested) {
|
if (!nfn.empty()) {
|
||||||
std::string qualified_name = nested->constant;
|
code_.SetValue("CPP_NAME", nfn);
|
||||||
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));
|
|
||||||
|
|
||||||
code_ += " const {{CPP_NAME}} *{{FIELD_NAME}}_nested_root() const {";
|
code_ += " const {{CPP_NAME}} *{{FIELD_NAME}}_nested_root() const {";
|
||||||
code_ +=
|
code_ +=
|
||||||
" return "
|
" return "
|
||||||
|
|||||||
@@ -1716,6 +1716,7 @@ struct Monster FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
|
|||||||
verifier.VerifyTable(enemy()) &&
|
verifier.VerifyTable(enemy()) &&
|
||||||
VerifyOffset(verifier, VT_TESTNESTEDFLATBUFFER) &&
|
VerifyOffset(verifier, VT_TESTNESTEDFLATBUFFER) &&
|
||||||
verifier.VerifyVector(testnestedflatbuffer()) &&
|
verifier.VerifyVector(testnestedflatbuffer()) &&
|
||||||
|
verifier.VerifyNestedFlatBuffer<MyGame::Example::Monster>(testnestedflatbuffer(), nullptr) &&
|
||||||
VerifyOffset(verifier, VT_TESTEMPTY) &&
|
VerifyOffset(verifier, VT_TESTEMPTY) &&
|
||||||
verifier.VerifyTable(testempty()) &&
|
verifier.VerifyTable(testempty()) &&
|
||||||
VerifyField<uint8_t>(verifier, VT_TESTBOOL) &&
|
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) &&
|
VerifyField<int8_t>(verifier, VT_SIGNED_ENUM) &&
|
||||||
VerifyOffset(verifier, VT_TESTREQUIREDNESTEDFLATBUFFER) &&
|
VerifyOffset(verifier, VT_TESTREQUIREDNESTEDFLATBUFFER) &&
|
||||||
verifier.VerifyVector(testrequirednestedflatbuffer()) &&
|
verifier.VerifyVector(testrequirednestedflatbuffer()) &&
|
||||||
|
verifier.VerifyNestedFlatBuffer<MyGame::Example::Monster>(testrequirednestedflatbuffer(), nullptr) &&
|
||||||
VerifyOffset(verifier, VT_SCALAR_KEY_SORTED_TABLES) &&
|
VerifyOffset(verifier, VT_SCALAR_KEY_SORTED_TABLES) &&
|
||||||
verifier.VerifyVector(scalar_key_sorted_tables()) &&
|
verifier.VerifyVector(scalar_key_sorted_tables()) &&
|
||||||
verifier.VerifyVectorOfTables(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));
|
TEST_EQ(true, MyGame::Example::VerifyMonsterBuffer(verifier));
|
||||||
// FIXME: these are currently not being properly verified, so turn them off
|
// FIXME: these are currently not being properly verified, so turn them off
|
||||||
// for fuzzing until they are.
|
// for fuzzing until they are.
|
||||||
parser.opts.json_nested_flatbuffers = false;
|
|
||||||
parser.opts.json_nested_flexbuffers = false;
|
parser.opts.json_nested_flexbuffers = false;
|
||||||
TEST_ASSERT(
|
TEST_ASSERT(
|
||||||
GenerateText(parser, parser.builder_.GetBufferPointer(), &jsongen));
|
GenerateText(parser, parser.builder_.GetBufferPointer(), &jsongen));
|
||||||
|
|||||||
@@ -1656,6 +1656,7 @@ struct Monster FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
|
|||||||
verifier.VerifyTable(enemy()) &&
|
verifier.VerifyTable(enemy()) &&
|
||||||
VerifyOffset(verifier, VT_TESTNESTEDFLATBUFFER) &&
|
VerifyOffset(verifier, VT_TESTNESTEDFLATBUFFER) &&
|
||||||
verifier.VerifyVector(testnestedflatbuffer()) &&
|
verifier.VerifyVector(testnestedflatbuffer()) &&
|
||||||
|
verifier.VerifyNestedFlatBuffer<MyGame::Example::Monster>(testnestedflatbuffer(), nullptr) &&
|
||||||
VerifyOffset(verifier, VT_TESTEMPTY) &&
|
VerifyOffset(verifier, VT_TESTEMPTY) &&
|
||||||
verifier.VerifyTable(testempty()) &&
|
verifier.VerifyTable(testempty()) &&
|
||||||
VerifyField<uint8_t>(verifier, VT_TESTBOOL) &&
|
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) &&
|
VerifyField<int8_t>(verifier, VT_SIGNED_ENUM) &&
|
||||||
VerifyOffset(verifier, VT_TESTREQUIREDNESTEDFLATBUFFER) &&
|
VerifyOffset(verifier, VT_TESTREQUIREDNESTEDFLATBUFFER) &&
|
||||||
verifier.VerifyVector(testrequirednestedflatbuffer()) &&
|
verifier.VerifyVector(testrequirednestedflatbuffer()) &&
|
||||||
|
verifier.VerifyNestedFlatBuffer<MyGame::Example::Monster>(testrequirednestedflatbuffer(), nullptr) &&
|
||||||
VerifyOffset(verifier, VT_SCALAR_KEY_SORTED_TABLES) &&
|
VerifyOffset(verifier, VT_SCALAR_KEY_SORTED_TABLES) &&
|
||||||
verifier.VerifyVector(scalar_key_sorted_tables()) &&
|
verifier.VerifyVector(scalar_key_sorted_tables()) &&
|
||||||
verifier.VerifyVectorOfTables(scalar_key_sorted_tables()) &&
|
verifier.VerifyVectorOfTables(scalar_key_sorted_tables()) &&
|
||||||
|
|||||||
Reference in New Issue
Block a user