Jeroen van Oosten created THRIFT-5272:
-----------------------------------------
Summary: printTo does not properly handle i8 datatypes
Key: THRIFT-5272
URL: https://issues.apache.org/jira/browse/THRIFT-5272
Project: Thrift
Issue Type: Bug
Components: C++ - Library
Affects Versions: 0.13.0
Environment: MSVC 2019 *and* Linux gcc 10.1.0
Reporter: Jeroen van Oosten
Attachments: TToString.h.patch
We have defined a datastructure with an i8 type in it, like so:
{code:java}
struct Meta
{
1: i8 channel,
2: i32 sequence
}
{code}
For debugging / logging purposes we are printing the information with Meta::
printTo, however the otuput is a bit odd. For example, we see this when the
channel number is 0:
Meta(channel= , sequence=5)
I would expect to see "channel=0", just like all other integer types.
Further investigation shows that at the empty space after "channel=" there is
in fact a null byte. And if I change 'channel' to 65, I get a "channel=A".
Clearly the ASCII value is being dumped, not the integer value.
I have traced down the problem to TToString.h, line 34. The template function
"to_string" there in combination with ostringstream does something weird when
the input is a int8_t, which corresponds to a 'char' of course.
The fix is to add a specialization of that template for int8_t:
{code:java}
inline std::string my_string(const int8_t& t) {
std::ostringstream o;
o << static_cast<int>(t);
return o.str();
}
{code}
For your information: std::to_string *does* produce the expected result.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)