mirror of
https://github.com/google/flatbuffers.git
synced 2026-07-03 00:28:18 +00:00
Add test for nested buffer verifier (#7252)
* Add test for nested buffer verifier * switch to base API
This commit is contained in:
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user