Skip to content

Commit 9a0a3cf

Browse files
Add ABSL_ATTRIBUTE_LIFETIME_BOUND attribute on generated repeated and map field accessors.
This allows the compiler to statically detect use-after-free bugs. This change touches a subset of field types. More changes to follow. PiperOrigin-RevId: 564777204
1 parent 3ae5a07 commit 9a0a3cf

File tree

4 files changed

+57
-19
lines changed

4 files changed

+57
-19
lines changed

src/google/protobuf/compiler/cpp/field_generators/enum_field.cc

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -405,25 +405,35 @@ void RepeatedEnum::GenerateInlineAccessorDefinitions(io::Printer* p) const {
405405
// @@protoc_insertion_point(field_get:$pkg.Msg.field$)
406406
return static_cast<$Enum$>(_internal_$name$().Get(index));
407407
}
408+
)cc");
409+
p->Emit(R"cc(
408410
inline void $Msg$::set_$name$(int index, $Enum$ value) {
409411
$assert_valid$;
410412
_internal_mutable_$name$()->Set(index, value);
411413
$annotate_set$
412414
// @@protoc_insertion_point(field_set:$pkg.Msg.field$)
413415
}
416+
)cc");
417+
p->Emit(R"cc(
414418
inline void $Msg$::add_$name$($Enum$ value) {
415419
$assert_valid$;
416420
$TsanDetectConcurrentMutation$;
417421
_internal_mutable_$name$()->Add(value);
418422
$annotate_add$
419423
// @@protoc_insertion_point(field_add:$pkg.Msg.field$)
420424
}
421-
inline const $pb$::RepeatedField<int>& $Msg$::$name$() const {
425+
)cc");
426+
p->Emit(R"cc(
427+
inline const $pb$::RepeatedField<int>& $Msg$::$name$() const
428+
ABSL_ATTRIBUTE_LIFETIME_BOUND {
422429
$annotate_list$;
423430
// @@protoc_insertion_point(field_list:$pkg.Msg.field$)
424431
return _internal_$name$();
425432
}
426-
inline $pb$::RepeatedField<int>* $Msg$::mutable_$name$() {
433+
)cc");
434+
p->Emit(R"cc(
435+
inline $pb$::RepeatedField<int>* $Msg$::mutable_$name$()
436+
ABSL_ATTRIBUTE_LIFETIME_BOUND {
427437
$annotate_mutable_list$;
428438
// @@protoc_insertion_point(field_mutable_list:$pkg.Msg.field$)
429439
$TsanDetectConcurrentMutation$;

src/google/protobuf/compiler/cpp/field_generators/map_field.cc

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -224,17 +224,23 @@ void Map::GenerateInlineAccessorDefinitions(io::Printer* p) const {
224224
$TsanDetectConcurrentRead$;
225225
return $field_$.GetMap();
226226
}
227-
inline const $Map$& $Msg$::$name$() const {
227+
)cc");
228+
p->Emit(R"cc(
229+
inline const $Map$& $Msg$::$name$() const ABSL_ATTRIBUTE_LIFETIME_BOUND {
228230
$annotate_get$;
229231
// @@protoc_insertion_point(field_map:$pkg.Msg.field$)
230232
return _internal_$name$();
231233
}
234+
)cc");
235+
p->Emit(R"cc(
232236
inline $Map$* $Msg$::_internal_mutable_$name$() {
233237
$PrepareSplitMessageForWrite$;
234238
$TsanDetectConcurrentMutation$;
235239
return $field_$.MutableMap();
236240
}
237-
inline $Map$* $Msg$::mutable_$name$() {
241+
)cc");
242+
p->Emit(R"cc(
243+
inline $Map$* $Msg$::mutable_$name$() ABSL_ATTRIBUTE_LIFETIME_BOUND {
238244
$annotate_mutable$;
239245
// @@protoc_insertion_point(field_mutable_map:$pkg.Msg.field$)
240246
return _internal_mutable_$name$();

src/google/protobuf/compiler/cpp/field_generators/primitive_field.cc

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -474,30 +474,40 @@ void RepeatedPrimitive::GenerateInlineAccessorDefinitions(
474474
// @@protoc_insertion_point(field_get:$pkg.Msg.field$)
475475
return _internal_$name$().Get(index);
476476
}
477+
)cc");
478+
p->Emit(R"cc(
477479
inline void $Msg$::set_$name$(int index, $Type$ value) {
478480
$annotate_set$;
479481
_internal_mutable_$name$()->Set(index, value);
480482
// @@protoc_insertion_point(field_set:$pkg.Msg.field$)
481483
}
484+
)cc");
485+
p->Emit(R"cc(
482486
inline void $Msg$::add_$name$($Type$ value) {
483487
$TsanDetectConcurrentMutation$;
484488
_internal_mutable_$name$()->Add(value);
485489
$annotate_add$;
486490
// @@protoc_insertion_point(field_add:$pkg.Msg.field$)
487491
}
488-
inline const $pb$::RepeatedField<$Type$>& $Msg$::$name$() const {
492+
)cc");
493+
p->Emit(R"cc(
494+
inline const $pb$::RepeatedField<$Type$>& $Msg$::$name$() const
495+
ABSL_ATTRIBUTE_LIFETIME_BOUND {
489496
$annotate_list$;
490497
// @@protoc_insertion_point(field_list:$pkg.Msg.field$)
491498
return _internal_$name$();
492499
}
493-
inline $pb$::RepeatedField<$Type$>* $Msg$::mutable_$name$() {
500+
)cc");
501+
p->Emit(R"cc(
502+
inline $pb$::RepeatedField<$Type$>* $Msg$::mutable_$name$()
503+
ABSL_ATTRIBUTE_LIFETIME_BOUND {
494504
$annotate_mutable_list$;
495505
// @@protoc_insertion_point(field_mutable_list:$pkg.Msg.field$)
496506
$TsanDetectConcurrentMutation$;
497507
return _internal_mutable_$name$();
498508
}
499-
500509
)cc");
510+
501511
if (should_split()) {
502512
p->Emit(R"cc(
503513
inline const $pb$::RepeatedField<$Type$>& $Msg$::_internal_$name$()

src/google/protobuf/descriptor.pb.h

Lines changed: 24 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)