Changes Announced on October 15, 2026

Changes announced for Protobuf 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.