You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@thrift.apache.org by "Sylwester Lachiewicz (Jira)" <ji...@apache.org> on 2026/09/08 11:30:00 UTC

[jira] [Resolved] (THRIFT-5791) Inconsistent behavior: Go does not use default values

     [ https://issues.apache.org/jira/browse/THRIFT-5791?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Sylwester Lachiewicz resolved THRIFT-5791.
------------------------------------------
    Resolution: Not A Bug

In Go, structs with default values must be instantiated using the generated constructor:
{code:go}
s := mypackage.NewStructDefaultI8()
// s.F_4 is initialized to 73
{code}

When serialized after constructor instantiation, the default value is transmitted over the wire (03 00 01 49 00).

Using a raw struct literal like &StructDefaultI8{} zero-initializes the scalar field to Go's default 0. Because 0 != 73, Go considers the field explicitly set and overrides the default.

In comparison across other languages:
- In C++, the constructor initializes f_4 = 73 and sets __isset.f_4 = true.
- In Rust, optional scalar defaults are typed as Option<i8> and default to None (0 wire bytes).
- In Java, scalar primitives default to __isset_bitfield = false and do not serialize until explicitly set (0 wire bytes).

Resolving as Not A Bug since callers must use NewStruct...() constructors to obtain IDL defaults in Go.

> Inconsistent behavior: Go does not use default values
> -----------------------------------------------------
>
>                 Key: THRIFT-5791
>                 URL: https://issues.apache.org/jira/browse/THRIFT-5791
>             Project: Thrift
>          Issue Type: Bug
>          Components: Go - Compiler, Go - Library
>    Affects Versions: 0.19.0, 0.20.0
>            Reporter: Team_RPCtester
>            Priority: Major
>         Attachments: image-2024-06-02-20-15-37-106.png, image-2024-06-02-20-15-55-606.png, image-2024-06-02-20-16-08-144.png, image-2024-06-14-21-43-51-655.png, image-2024-06-14-21-45-17-915.png, submit_thrift.zip, temp_thrift.zip
>
>
> Hi,
> We are software engineering researchers working on automated program analysis techniques to improve the reliability of RPC frameworks.
>  
> We discover a bug illustrated by the following example (The attached script can help you reproduce the issue).
> When using a .thrift file to define a struct, if one of the fields is optional and has a default i8 value (e.g., 73), there is an inconsistent behavior in implementations across different languages. Specifically:
>  # In the Go implementation, if the field is not explicitly defined or assigned a value, the transmitted value is 0.
>  # In the Python and Node.js implementations, if the field is not explicitly defined or assigned a value, the transmitted value is the default value of 73.
> This inconsistency indicates that there might be an issue with the Go implementation.
> In our setting, we use Go, Node.js, and Python 3 as the server side, and use Go, Node.js, and Python 3, as the client side. The thrift file we use is shown in the flowing picture:
> !image-2024-06-02-20-15-37-106.png!
> When calling Method_3, the message passed is an instance of StructClass_0, where f_4 is not set. The f_4 is automatically defined as 0, while in Python 3 and Node.js, f_4 is 73.
> The result is shown as bellow:
> !image-2024-06-02-20-15-55-606.png!
> go-py3_json_buffered-ip_client.log
> !image-2024-06-02-20-16-08-144.png!
> go-go_json_buffered-ip_client.log
> The attachments provided are essential for reproducing the issue. By following the commands outlined in the accompanying readme.md, you will be able to replicate the problem accurately.
>  
> *This is our first submission. If you have any preferred methods, please feel free to let us know. Thank you.*



--
This message was sent by Atlassian Jira
(v8.20.10#820010)