[
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)