Add test for nested buffer verifier (#7252)

* Add test for nested buffer verifier

* switch to base API
This commit is contained in:
Derek Bailey
2022-04-18 10:20:06 -07:00
committed by GitHub
parent b856368d75
commit 6e0e79f24f
2 changed files with 66 additions and 9 deletions

View File

@@ -342,7 +342,7 @@ if(MSVC)
/WX /WX
/wd4512 # C4512: assignment operator could not be generated /wd4512 # C4512: assignment operator could not be generated
/wd4316 # C4316: object allocated on the heap may not be aligned /wd4316 # C4316: object allocated on the heap may not be aligned
/wd4456 # C4456: hides previous local declaration
$<$<CXX_COMPILER_ID:CLANG>: $<$<CXX_COMPILER_ID:CLANG>:
/D_CRT_SECURE_NO_WARNINGS /D_CRT_SECURE_NO_WARNINGS
> >
@@ -359,7 +359,6 @@ else()
-Wold-style-cast -Wold-style-cast
-Wimplicit-fallthrough -Wimplicit-fallthrough
-Wextra-semi -Wextra-semi
-Werror=shadow
-fsigned-char -fsigned-char
-Wnon-virtual-dtor -Wnon-virtual-dtor

View File

@@ -150,7 +150,7 @@ flatbuffers::DetachedBuffer CreateFlatBufferTest(std::string &buffer) {
#endif #endif
// Make sure the template deduces an initializer as std::vector<std::string> // Make sure the template deduces an initializer as std::vector<std::string>
builder.CreateVectorOfStrings({"hello", "world"}); builder.CreateVectorOfStrings({ "hello", "world" });
// Create many vectors of strings // Create many vectors of strings
std::vector<std::string> manyNames; std::vector<std::string> manyNames;
@@ -227,7 +227,7 @@ flatbuffers::DetachedBuffer CreateFlatBufferTest(std::string &buffer) {
FinishMonsterBuffer(builder, mloc); FinishMonsterBuffer(builder, mloc);
// clang-format off // clang-format off
#ifdef FLATBUFFERS_TEST_VERBOSE #ifdef FLATBUFFERS_TEST_VERBOSE
// print byte data for debugging: // print byte data for debugging:
auto p = builder.GetBufferPointer(); auto p = builder.GetBufferPointer();
@@ -253,7 +253,7 @@ void AccessFlatBufferTest(const uint8_t *flatbuf, size_t length,
verifier.SetFlexReuseTracker(&flex_reuse_tracker); verifier.SetFlexReuseTracker(&flex_reuse_tracker);
TEST_EQ(VerifyMonsterBuffer(verifier), true); TEST_EQ(VerifyMonsterBuffer(verifier), true);
// clang-format off // clang-format off
#ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE
std::vector<uint8_t> test_buff; std::vector<uint8_t> test_buff;
test_buff.resize(length * 2); test_buff.resize(length * 2);
@@ -634,7 +634,7 @@ void SizePrefixedTest() {
} }
void TriviallyCopyableTest() { void TriviallyCopyableTest() {
// clang-format off // clang-format off
#if __GNUG__ && __GNUC__ < 5 #if __GNUG__ && __GNUC__ < 5
TEST_EQ(__has_trivial_copy(Vec3), true); TEST_EQ(__has_trivial_copy(Vec3), true);
#else #else
@@ -1615,7 +1615,7 @@ void FuzzTest2() {
} }
}; };
// clang-format off // clang-format off
#define AddToSchemaAndInstances(schema_add, instance_add) \ #define AddToSchemaAndInstances(schema_add, instance_add) \
RndDef::Add(definitions, schema, instances_per_definition, \ RndDef::Add(definitions, schema, instances_per_definition, \
schema_add, instance_add, definition) schema_add, instance_add, definition)
@@ -1769,7 +1769,7 @@ void FuzzTest2() {
TEST_NOTNULL(nullptr); //-V501 (this comment supresses CWE-570 warning) TEST_NOTNULL(nullptr); //-V501 (this comment supresses CWE-570 warning)
} }
// clang-format off // clang-format off
#ifdef FLATBUFFERS_TEST_VERBOSE #ifdef FLATBUFFERS_TEST_VERBOSE
TEST_OUTPUT_LINE("%dk schema tested with %dk of json\n", TEST_OUTPUT_LINE("%dk schema tested with %dk of json\n",
static_cast<int>(schema.length() / 1024), static_cast<int>(schema.length() / 1024),
@@ -3161,7 +3161,7 @@ void FlexBuffersTest() {
}); });
slb.Finish(); slb.Finish();
// clang-format off // clang-format off
#ifdef FLATBUFFERS_TEST_VERBOSE #ifdef FLATBUFFERS_TEST_VERBOSE
for (size_t i = 0; i < slb.GetBuffer().size(); i++) for (size_t i = 0; i < slb.GetBuffer().size(); i++)
printf("%d ", slb.GetBuffer().data()[i]); printf("%d ", slb.GetBuffer().data()[i]);
@@ -4179,6 +4179,63 @@ void FieldIdentifierTest() {
#endif #endif
} }
void NestedVerifierTest() {
// Create a nested monster.
flatbuffers::FlatBufferBuilder nested_builder;
FinishMonsterBuffer(
nested_builder,
CreateMonster(nested_builder, nullptr, 0, 0,
nested_builder.CreateString("NestedMonster")));
// Verify the nested monster
flatbuffers::Verifier verifier(nested_builder.GetBufferPointer(),
nested_builder.GetSize());
TEST_EQ(true, VerifyMonsterBuffer(verifier));
{
// Create the outer monster.
flatbuffers::FlatBufferBuilder builder;
// Add the nested monster as a vector of bytes.
auto nested_monster_bytes = builder.CreateVector(
nested_builder.GetBufferPointer(), nested_builder.GetSize());
auto name = builder.CreateString("OuterMonster");
MonsterBuilder mon_builder(builder);
mon_builder.add_name(name);
mon_builder.add_testnestedflatbuffer(nested_monster_bytes);
FinishMonsterBuffer(builder, mon_builder.Finish());
// Verify the root monster, which includes verifing the nested monster
flatbuffers::Verifier verifier(builder.GetBufferPointer(),
builder.GetSize());
TEST_EQ(true, VerifyMonsterBuffer(verifier));
}
{
// Create the outer monster.
flatbuffers::FlatBufferBuilder builder;
// Purposely invalidate the nested flatbuffer setting its length to 1, an
// invalid length.
uint8_t invalid_nested_buffer[1];
auto nested_monster_bytes = builder.CreateVector(invalid_nested_buffer, 1);
auto name = builder.CreateString("OuterMonster");
MonsterBuilder mon_builder(builder);
mon_builder.add_name(name);
mon_builder.add_testnestedflatbuffer(nested_monster_bytes);
FinishMonsterBuffer(builder, mon_builder.Finish());
// Verify the root monster fails, since the included nested monster fails.
flatbuffers::Verifier verifier(builder.GetBufferPointer(),
builder.GetSize());
TEST_EQ(false, VerifyMonsterBuffer(verifier));
}
}
void ParseIncorrectMonsterJsonTest() { void ParseIncorrectMonsterJsonTest() {
std::string schemafile; std::string schemafile;
TEST_EQ(flatbuffers::LoadFile((test_data_path + "monster_test.bfbs").c_str(), TEST_EQ(flatbuffers::LoadFile((test_data_path + "monster_test.bfbs").c_str(),
@@ -4364,6 +4421,7 @@ int FlatBufferTests() {
FixedLengthArraySpanTest(); FixedLengthArraySpanTest();
StructUnionTest(); StructUnionTest();
WarningsAsErrorsTest(); WarningsAsErrorsTest();
NestedVerifierTest();
return 0; return 0;
} }