Skip to content

Commit 20548ff

Browse files
Size verifier fix 2 (#8740)
* Fixes to make SizeVerifier work. In particular change all the places in the Flatbuffers library and generated code that were using `Verifier` to instead use `VerifierTemplate<TrackBufferSize>` and wrap them all inside `template <bool TrackBufferSize = false>`. Also add unit tests for SizeVerifier. * Format using `sh scripts/clang-format-git.sh` * Use `B` rather than `TrackBufferSize` for the name of the template parameter. * Update generated files.
1 parent 7ea8db0 commit 20548ff

30 files changed

+588
-305
lines changed

goldens/cpp/basic_generated.h

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ struct Galaxy FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
3030
int64_t num_stars() const {
3131
return GetField<int64_t>(VT_NUM_STARS, 0);
3232
}
33-
bool Verify(::flatbuffers::Verifier &verifier) const {
33+
template <bool B = false>
34+
bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {
3435
return VerifyTableStart(verifier) &&
3536
VerifyField<int64_t>(verifier, VT_NUM_STARS, 8) &&
3637
verifier.EndTable();
@@ -75,7 +76,8 @@ struct Universe FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
7576
const ::flatbuffers::Vector<::flatbuffers::Offset<flatbuffers::goldens::Galaxy>> *galaxies() const {
7677
return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<flatbuffers::goldens::Galaxy>> *>(VT_GALAXIES);
7778
}
78-
bool Verify(::flatbuffers::Verifier &verifier) const {
79+
template <bool B = false>
80+
bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {
7981
return VerifyTableStart(verifier) &&
8082
VerifyField<double>(verifier, VT_AGE, 8) &&
8183
VerifyOffset(verifier, VT_GALAXIES) &&
@@ -135,14 +137,16 @@ inline const flatbuffers::goldens::Universe *GetSizePrefixedUniverse(const void
135137
return ::flatbuffers::GetSizePrefixedRoot<flatbuffers::goldens::Universe>(buf);
136138
}
137139

140+
template <bool B = false>
138141
inline bool VerifyUniverseBuffer(
139-
::flatbuffers::Verifier &verifier) {
140-
return verifier.VerifyBuffer<flatbuffers::goldens::Universe>(nullptr);
142+
::flatbuffers::VerifierTemplate<B> &verifier) {
143+
return verifier.template VerifyBuffer<flatbuffers::goldens::Universe>(nullptr);
141144
}
142145

146+
template <bool B = false>
143147
inline bool VerifySizePrefixedUniverseBuffer(
144-
::flatbuffers::Verifier &verifier) {
145-
return verifier.VerifySizePrefixedBuffer<flatbuffers::goldens::Universe>(nullptr);
148+
::flatbuffers::VerifierTemplate<B> &verifier) {
149+
return verifier.template VerifySizePrefixedBuffer<flatbuffers::goldens::Universe>(nullptr);
146150
}
147151

148152
inline void FinishUniverseBuffer(

include/flatbuffers/flex_flat_util.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,10 @@
2323
namespace flexbuffers {
2424

2525
// Verifies the `nested` flexbuffer within a flatbuffer vector is valid.
26+
template <bool B>
2627
inline bool VerifyNestedFlexBuffer(
2728
const flatbuffers::Vector<uint8_t>* const nested,
28-
flatbuffers::Verifier& verifier) {
29+
flatbuffers::VerifierTemplate<B>& verifier) {
2930
if (!nested) return true;
3031
return verifier.Check(flexbuffers::VerifyBuffer(
3132
nested->data(), nested->size(), verifier.GetFlexReuseTracker()));

include/flatbuffers/reflection_generated.h

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,8 @@ struct Type FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
196196
uint32_t element_size() const {
197197
return GetField<uint32_t>(VT_ELEMENT_SIZE, 0);
198198
}
199-
bool Verify(::flatbuffers::Verifier &verifier) const {
199+
template <bool B = false>
200+
bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {
200201
return VerifyTableStart(verifier) &&
201202
VerifyField<int8_t>(verifier, VT_BASE_TYPE, 1) &&
202203
VerifyField<int8_t>(verifier, VT_ELEMENT, 1) &&
@@ -283,7 +284,8 @@ struct KeyValue FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
283284
const ::flatbuffers::String *value() const {
284285
return GetPointer<const ::flatbuffers::String *>(VT_VALUE);
285286
}
286-
bool Verify(::flatbuffers::Verifier &verifier) const {
287+
template <bool B = false>
288+
bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {
287289
return VerifyTableStart(verifier) &&
288290
VerifyOffsetRequired(verifier, VT_KEY) &&
289291
verifier.VerifyString(key()) &&
@@ -367,7 +369,8 @@ struct EnumVal FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
367369
const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>> *attributes() const {
368370
return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>> *>(VT_ATTRIBUTES);
369371
}
370-
bool Verify(::flatbuffers::Verifier &verifier) const {
372+
template <bool B = false>
373+
bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {
371374
return VerifyTableStart(verifier) &&
372375
VerifyOffsetRequired(verifier, VT_NAME) &&
373376
verifier.VerifyString(name()) &&
@@ -495,7 +498,8 @@ struct Enum FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
495498
const ::flatbuffers::String *declaration_file() const {
496499
return GetPointer<const ::flatbuffers::String *>(VT_DECLARATION_FILE);
497500
}
498-
bool Verify(::flatbuffers::Verifier &verifier) const {
501+
template <bool B = false>
502+
bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {
499503
return VerifyTableStart(verifier) &&
500504
VerifyOffsetRequired(verifier, VT_NAME) &&
501505
verifier.VerifyString(name()) &&
@@ -675,7 +679,8 @@ struct Field FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
675679
bool offset64() const {
676680
return GetField<uint8_t>(VT_OFFSET64, 0) != 0;
677681
}
678-
bool Verify(::flatbuffers::Verifier &verifier) const {
682+
template <bool B = false>
683+
bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {
679684
return VerifyTableStart(verifier) &&
680685
VerifyOffsetRequired(verifier, VT_NAME) &&
681686
verifier.VerifyString(name()) &&
@@ -880,7 +885,8 @@ struct Object FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
880885
const ::flatbuffers::String *declaration_file() const {
881886
return GetPointer<const ::flatbuffers::String *>(VT_DECLARATION_FILE);
882887
}
883-
bool Verify(::flatbuffers::Verifier &verifier) const {
888+
template <bool B = false>
889+
bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {
884890
return VerifyTableStart(verifier) &&
885891
VerifyOffsetRequired(verifier, VT_NAME) &&
886892
verifier.VerifyString(name()) &&
@@ -1028,7 +1034,8 @@ struct RPCCall FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
10281034
const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *documentation() const {
10291035
return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *>(VT_DOCUMENTATION);
10301036
}
1031-
bool Verify(::flatbuffers::Verifier &verifier) const {
1037+
template <bool B = false>
1038+
bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {
10321039
return VerifyTableStart(verifier) &&
10331040
VerifyOffsetRequired(verifier, VT_NAME) &&
10341041
verifier.VerifyString(name()) &&
@@ -1151,7 +1158,8 @@ struct Service FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
11511158
const ::flatbuffers::String *declaration_file() const {
11521159
return GetPointer<const ::flatbuffers::String *>(VT_DECLARATION_FILE);
11531160
}
1154-
bool Verify(::flatbuffers::Verifier &verifier) const {
1161+
template <bool B = false>
1162+
bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {
11551163
return VerifyTableStart(verifier) &&
11561164
VerifyOffsetRequired(verifier, VT_NAME) &&
11571165
verifier.VerifyString(name()) &&
@@ -1267,7 +1275,8 @@ struct SchemaFile FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
12671275
const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *included_filenames() const {
12681276
return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *>(VT_INCLUDED_FILENAMES);
12691277
}
1270-
bool Verify(::flatbuffers::Verifier &verifier) const {
1278+
template <bool B = false>
1279+
bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {
12711280
return VerifyTableStart(verifier) &&
12721281
VerifyOffsetRequired(verifier, VT_FILENAME) &&
12731282
verifier.VerifyString(filename()) &&
@@ -1360,7 +1369,8 @@ struct Schema FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
13601369
const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::SchemaFile>> *fbs_files() const {
13611370
return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::SchemaFile>> *>(VT_FBS_FILES);
13621371
}
1363-
bool Verify(::flatbuffers::Verifier &verifier) const {
1372+
template <bool B = false>
1373+
bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {
13641374
return VerifyTableStart(verifier) &&
13651375
VerifyOffsetRequired(verifier, VT_OBJECTS) &&
13661376
verifier.VerifyVector(objects()) &&
@@ -1498,14 +1508,16 @@ inline bool SizePrefixedSchemaBufferHasIdentifier(const void *buf) {
14981508
buf, SchemaIdentifier(), true);
14991509
}
15001510

1511+
template <bool B = false>
15011512
inline bool VerifySchemaBuffer(
1502-
::flatbuffers::Verifier &verifier) {
1503-
return verifier.VerifyBuffer<reflection::Schema>(SchemaIdentifier());
1513+
::flatbuffers::VerifierTemplate<B> &verifier) {
1514+
return verifier.template VerifyBuffer<reflection::Schema>(SchemaIdentifier());
15041515
}
15051516

1517+
template <bool B = false>
15061518
inline bool VerifySizePrefixedSchemaBuffer(
1507-
::flatbuffers::Verifier &verifier) {
1508-
return verifier.VerifySizePrefixedBuffer<reflection::Schema>(SchemaIdentifier());
1519+
::flatbuffers::VerifierTemplate<B> &verifier) {
1520+
return verifier.template VerifySizePrefixedBuffer<reflection::Schema>(SchemaIdentifier());
15091521
}
15101522

15111523
inline const char *SchemaExtension() {

include/flatbuffers/table.h

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -122,49 +122,58 @@ class Table {
122122

123123
// Verify the vtable of this table.
124124
// Call this once per table, followed by VerifyField once per field.
125-
bool VerifyTableStart(Verifier& verifier) const {
125+
template <bool B>
126+
bool VerifyTableStart(VerifierTemplate<B>& verifier) const {
126127
return verifier.VerifyTableStart(data_);
127128
}
128129

129130
// Verify a particular field.
130-
template <typename T>
131-
bool VerifyField(const Verifier& verifier, voffset_t field,
131+
template <typename T, bool B>
132+
bool VerifyField(const VerifierTemplate<B>& verifier, voffset_t field,
132133
size_t align) const {
133134
// Calling GetOptionalFieldOffset should be safe now thanks to
134135
// VerifyTable().
135136
auto field_offset = GetOptionalFieldOffset(field);
136137
// Check the actual field.
137-
return !field_offset || verifier.VerifyField<T>(data_, field_offset, align);
138+
return !field_offset ||
139+
verifier.template VerifyField<T>(data_, field_offset, align);
138140
}
139141

140142
// VerifyField for required fields.
141-
template <typename T>
142-
bool VerifyFieldRequired(const Verifier& verifier, voffset_t field,
143+
template <typename T, bool B>
144+
bool VerifyFieldRequired(const VerifierTemplate<B>& verifier, voffset_t field,
143145
size_t align) const {
144146
auto field_offset = GetOptionalFieldOffset(field);
145147
return verifier.Check(field_offset != 0) &&
146-
verifier.VerifyField<T>(data_, field_offset, align);
148+
verifier.template VerifyField<T>(data_, field_offset, align);
147149
}
148150

149151
// Versions for offsets.
150-
template <typename OffsetT = uoffset_t>
151-
bool VerifyOffset(const Verifier& verifier, voffset_t field) const {
152+
template <typename OffsetT = uoffset_t, bool B = false>
153+
bool VerifyOffset(const VerifierTemplate<B>& verifier,
154+
voffset_t field) const {
152155
auto field_offset = GetOptionalFieldOffset(field);
153-
return !field_offset || verifier.VerifyOffset<OffsetT>(data_, field_offset);
156+
return !field_offset ||
157+
verifier.template VerifyOffset<OffsetT>(data_, field_offset);
154158
}
155159

156-
template <typename OffsetT = uoffset_t>
157-
bool VerifyOffsetRequired(const Verifier& verifier, voffset_t field) const {
160+
template <typename OffsetT = uoffset_t, bool B = false>
161+
bool VerifyOffsetRequired(const VerifierTemplate<B>& verifier,
162+
voffset_t field) const {
158163
auto field_offset = GetOptionalFieldOffset(field);
159164
return verifier.Check(field_offset != 0) &&
160-
verifier.VerifyOffset<OffsetT>(data_, field_offset);
165+
verifier.template VerifyOffset<OffsetT>(data_, field_offset);
161166
}
162167

163-
bool VerifyOffset64(const Verifier& verifier, voffset_t field) const {
168+
template <bool B>
169+
bool VerifyOffset64(const VerifierTemplate<B>& verifier,
170+
voffset_t field) const {
164171
return VerifyOffset<uoffset64_t>(verifier, field);
165172
}
166173

167-
bool VerifyOffset64Required(const Verifier& verifier, voffset_t field) const {
174+
template <bool B>
175+
bool VerifyOffset64Required(const VerifierTemplate<B>& verifier,
176+
voffset_t field) const {
168177
return VerifyOffsetRequired<uoffset64_t>(verifier, field);
169178
}
170179

samples/monster_generated.h

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -179,8 +179,10 @@ inline bool operator!=(const EquipmentUnion &lhs, const EquipmentUnion &rhs) {
179179
return !(lhs == rhs);
180180
}
181181

182-
bool VerifyEquipment(::flatbuffers::Verifier &verifier, const void *obj, Equipment type);
183-
bool VerifyEquipmentVector(::flatbuffers::Verifier &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset<void>> *values, const ::flatbuffers::Vector<uint8_t> *types);
182+
template <bool B = false>
183+
bool VerifyEquipment(::flatbuffers::VerifierTemplate<B> &verifier, const void *obj, Equipment type);
184+
template <bool B = false>
185+
bool VerifyEquipmentVector(::flatbuffers::VerifierTemplate<B> &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset<void>> *values, const ::flatbuffers::Vector<uint8_t> *types);
184186

185187
FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(4) Vec3 FLATBUFFERS_FINAL_CLASS {
186188
private:
@@ -331,7 +333,8 @@ struct Monster FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
331333
::flatbuffers::Vector<const MyGame::Sample::Vec3 *> *mutable_path() {
332334
return GetPointer<::flatbuffers::Vector<const MyGame::Sample::Vec3 *> *>(VT_PATH);
333335
}
334-
bool Verify(::flatbuffers::Verifier &verifier) const {
336+
template <bool B = false>
337+
bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {
335338
return VerifyTableStart(verifier) &&
336339
VerifyField<MyGame::Sample::Vec3>(verifier, VT_POS, 4) &&
337340
VerifyField<int16_t>(verifier, VT_MANA, 2) &&
@@ -491,7 +494,8 @@ struct Weapon FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
491494
bool mutate_damage(int16_t _damage = 0) {
492495
return SetField<int16_t>(VT_DAMAGE, _damage, 0);
493496
}
494-
bool Verify(::flatbuffers::Verifier &verifier) const {
497+
template <bool B = false>
498+
bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {
495499
return VerifyTableStart(verifier) &&
496500
VerifyOffset(verifier, VT_NAME) &&
497501
verifier.VerifyString(name()) &&
@@ -686,7 +690,8 @@ inline ::flatbuffers::Offset<Weapon> Weapon::Pack(::flatbuffers::FlatBufferBuild
686690
_damage);
687691
}
688692

689-
inline bool VerifyEquipment(::flatbuffers::Verifier &verifier, const void *obj, Equipment type) {
693+
template <bool B>
694+
inline bool VerifyEquipment(::flatbuffers::VerifierTemplate<B> &verifier, const void *obj, Equipment type) {
690695
switch (type) {
691696
case Equipment_NONE: {
692697
return true;
@@ -699,7 +704,8 @@ inline bool VerifyEquipment(::flatbuffers::Verifier &verifier, const void *obj,
699704
}
700705
}
701706

702-
inline bool VerifyEquipmentVector(::flatbuffers::Verifier &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset<void>> *values, const ::flatbuffers::Vector<uint8_t> *types) {
707+
template <bool B>
708+
inline bool VerifyEquipmentVector(::flatbuffers::VerifierTemplate<B> &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset<void>> *values, const ::flatbuffers::Vector<uint8_t> *types) {
703709
if (!values || !types) return !values && !types;
704710
if (values->size() != types->size()) return false;
705711
for (::flatbuffers::uoffset_t i = 0; i < values->size(); ++i) {
@@ -883,14 +889,16 @@ inline MyGame::Sample::Monster *GetMutableSizePrefixedMonster(void *buf) {
883889
return ::flatbuffers::GetMutableSizePrefixedRoot<MyGame::Sample::Monster>(buf);
884890
}
885891

892+
template <bool B = false>
886893
inline bool VerifyMonsterBuffer(
887-
::flatbuffers::Verifier &verifier) {
888-
return verifier.VerifyBuffer<MyGame::Sample::Monster>(nullptr);
894+
::flatbuffers::VerifierTemplate<B> &verifier) {
895+
return verifier.template VerifyBuffer<MyGame::Sample::Monster>(nullptr);
889896
}
890897

898+
template <bool B = false>
891899
inline bool VerifySizePrefixedMonsterBuffer(
892-
::flatbuffers::Verifier &verifier) {
893-
return verifier.VerifySizePrefixedBuffer<MyGame::Sample::Monster>(nullptr);
900+
::flatbuffers::VerifierTemplate<B> &verifier) {
901+
return verifier.template VerifySizePrefixedBuffer<MyGame::Sample::Monster>(nullptr);
894902
}
895903

896904
inline void FinishMonsterBuffer(

0 commit comments

Comments
 (0)