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

Reply via email to