Changes Announced on October 15, 2026
The following sections cover additional planned breaking changes in the v38 release, expected in 2027 Q1. These describe changes as we anticipate them being implemented, but due to the flexible nature of software some of these changes may not land or may vary from how they are described in this topic.
Changes in C++
Remove NULL Termination in Descriptor Names
Descriptor APIs that return absl::string_view will no longer guarantee null
termination. The null terminators are being removed to achieve memory savings in
descriptors.
This change applies to descriptor methods that return absl::string_view.
Callers must not assume that the pointer returned by .data() is
null-terminated. If a null-terminated C-style string is required, callers should
explicitly construct a std::string (for example, std::string(desc->name()))
or migrate to APIs that accept absl::string_view directly.
Changes in Protoc
Disallow Conflicting Descriptors in --descriptor_set_in
Protoc will error when conflicting file descriptors are provided via
--descriptor_set_in.
Protoc introduced a warning when conflicting descriptors are detected across
input sets. In the v38 release, this warning becomes an error. Build systems and
callers must ensure that descriptor sets fed to --descriptor_set_in do not
provide conflicting definitions for the same .proto file.
Changes in Python
Align __eq__() with Any Fields on Pure Python with Py-upb Behavior
Align pure PythonProto __eq__() behavior to upb by only comparing the
serialized bytes. There are some edge cases where two Any fields may contain
different bytes which are equal only when parsed. These cases used to return
true, but will now return false.
Changes in UPB
Align Default Value Float and Double Formatting with C++ FileDescriptor::CopyTo
In upb_FileDef_ToProto, float and double default values in
FieldDescriptorProto.default_value were previously formatted using hardcoded
"%.9g" and "%.17g". This could produce more digits than C++
FieldDescriptor::DefaultValueAsString() (io::SimpleFtoa / io::SimpleDtoa),
causing upb_FileDef_ToProto output to differ from C++ FileDescriptor::CopyTo
(for example, "0.10000000000000001" vs "0.1" for double, and
"7.77777779e+35" vs "7.777778e+35" for float).
In v38, upb_FileDef_ToProto will format float and double default values
using round-trip formatting matching io::SimpleFtoa and io::SimpleDtoa.