From 4052f43c305b8629a48c92694837d3224268a9d1 Mon Sep 17 00:00:00 2001 From: Denis Blank Date: Sat, 10 Sep 2022 11:21:42 +0200 Subject: [PATCH] Failing unit test for #7516 --- CMakeLists.txt | 5 +++++ tests/alignment_test.cpp | 31 +++++++++++++++++++++++++++++++ tests/alignment_test.fbs | 24 ++++++++++++++++++++++++ tests/alignment_test.h | 12 ++++++++++++ tests/test.cpp | 3 +++ 5 files changed, 75 insertions(+) create mode 100644 tests/alignment_test.cpp create mode 100644 tests/alignment_test.fbs create mode 100644 tests/alignment_test.h diff --git a/CMakeLists.txt b/CMakeLists.txt index f5ae5ac81c7..7c740fb2433 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -230,6 +230,8 @@ set(FlatBuffers_Tests_SRCS tests/util_test.cpp tests/native_type_test_impl.h tests/native_type_test_impl.cpp + tests/alignment_test.h + tests/alignment_test.cpp include/flatbuffers/code_generators.h src/code_generators.cpp # file generate by running compiler on tests/monster_test.fbs @@ -251,6 +253,8 @@ set(FlatBuffers_Tests_SRCS ${CMAKE_CURRENT_BINARY_DIR}/tests/optional_scalars_generated.h # file generate by running compiler on tests/native_inline_table_test.fbs ${CMAKE_CURRENT_BINARY_DIR}/tests/native_inline_table_test_generated.h + # file generate by running compiler on tests/alignment_test.fbs + ${CMAKE_CURRENT_BINARY_DIR}/tests/alignment_test_generated.h ) set(FlatBuffers_Tests_CPP17_SRCS @@ -623,6 +627,7 @@ if(FLATBUFFERS_BUILD_TESTS) compile_flatbuffers_schema_to_binary(tests/arrays_test.fbs) compile_flatbuffers_schema_to_embedded_binary(tests/monster_test.fbs "--no-includes;--gen-compare") compile_flatbuffers_schema_to_cpp(tests/native_inline_table_test.fbs "--gen-compare") + compile_flatbuffers_schema_to_cpp(tests/alignment_test.fbs "--gen-compare") if(NOT (MSVC AND (MSVC_VERSION LESS 1900))) compile_flatbuffers_schema_to_cpp(tests/monster_extra.fbs) # Test floating-point NAN/INF. endif() diff --git a/tests/alignment_test.cpp b/tests/alignment_test.cpp new file mode 100644 index 00000000000..1026fc3397c --- /dev/null +++ b/tests/alignment_test.cpp @@ -0,0 +1,31 @@ +#include "alignment_test.h" + +#include "flatbuffers/flatbuffer_builder.h" +#include "alignment_test_generated.h" +#include "test_assert.h" + +namespace flatbuffers { +namespace tests { + +void AlignmentTest() { + FlatBufferBuilder builder; + + BadAlignmentLarge large; + Offset outer_large = CreateOuterLarge(builder, &large); + + BadAlignmentSmall *small; + Offset> small_offset = + builder.CreateUninitializedVectorOfStructs(9, &small); + (void)small; // We do not have to write data to trigger the test failure + + Offset root = + CreateBadAlignmentRoot(builder, outer_large, small_offset); + + builder.Finish(root); + + Verifier verifier(builder.GetBufferPointer(), builder.GetSize()); + TEST_ASSERT(VerifyBadAlignmentRootBuffer(verifier)); +} + +} // namespace tests +} // namespace flatbuffers diff --git a/tests/alignment_test.fbs b/tests/alignment_test.fbs new file mode 100644 index 00000000000..3fc08bd7ff5 --- /dev/null +++ b/tests/alignment_test.fbs @@ -0,0 +1,24 @@ +// sizeof(BadAlignmentSmall) == 12 +// alignof(BadAlignmentSmall) == 4 +struct BadAlignmentSmall { + var_0: uint; + var_1: uint; + var_2: uint; +} + +// sizeof(BadAlignmentLarge) == 8 +// alignof(BadAlignmentLarge) == 8 +struct BadAlignmentLarge { + var_0: ulong; +} + +table OuterLarge { + large: BadAlignmentLarge; +} + +table BadAlignmentRoot { + large: OuterLarge; + small: [BadAlignmentSmall]; +} + +root_type BadAlignmentRoot; diff --git a/tests/alignment_test.h b/tests/alignment_test.h new file mode 100644 index 00000000000..68cdf0bd82e --- /dev/null +++ b/tests/alignment_test.h @@ -0,0 +1,12 @@ +#ifndef TESTS_ALIGNMENT_TEST_H +#define TESTS_ALIGNMENT_TEST_H + +namespace flatbuffers { +namespace tests { + +void AlignmentTest(); + +} // namespace tests +} // namespace flatbuffers + +#endif diff --git a/tests/test.cpp b/tests/test.cpp index d99e606506e..eecc825d5c8 100644 --- a/tests/test.cpp +++ b/tests/test.cpp @@ -20,6 +20,7 @@ #include #include "evolution_test.h" +#include "alignment_test.h" #include "flatbuffers/flatbuffers.h" #include "flatbuffers/idl.h" #include "flatbuffers/minireflect.h" @@ -1415,6 +1416,8 @@ int FlatBufferTests(const std::string &tests_data_path) { SizePrefixedTest(); + AlignmentTest(); + #ifndef FLATBUFFERS_NO_FILE_TESTS ParseAndGenerateTextTest(tests_data_path, false); ParseAndGenerateTextTest(tests_data_path, true);