msgpack / msgpack-c

MessagePack implementation for C and C++ / msgpack.org[C/C++]
Other
3k stars 873 forks source link

Conversions between float and int are not type-checked. #1139

Open mayuehit opened 3 weeks ago

mayuehit commented 3 weeks ago

Describe the bug I've been using msgpack-c 4.0.0, which does type checking for conversions between float and int.But when I updated to 4.1.3, I found that the same code produced a different behavior.

To Reproduce

Code:

  float original_value = 1.0;

  msgpack::sbuffer buffer;
  msgpack::pack(buffer, original_value);

  msgpack::object_handle oh = msgpack::unpack(buffer.data(), buffer.size());

  try {
      int unpacked_value = oh.get().as<int>();
      std::cout << "Unpacked value: " << unpacked_value << std::endl;
  } catch (const std::exception& e) {
      std::cerr << "Failed to unpack as int " << e.what() << std::endl;
  }

Output: When I run this code with msgpack-c 4.0.0

Failed to unpack as int std::bad_cast

But when I run this code with msgpack-c 4.1.3

Unpacked value: 1

Please prepare https://stackoverflow.com/help/minimal-reproducible-example

Expected behavior I expect it to report an error, because this kind of unchecked type conversion tends to be problematic.

redboltz commented 3 weeks ago

Thank you for reporting this issue. The change was introduced in pull request #1018, which addresses issue #1017 that explains the rationale behind this update.

This update was implemented in version 4.1.2. You can refer to the changelog here: https://github.com/msgpack/msgpack-c/blob/cpp_master/CHANGELOG.md#2022-09-07-version-412-for-c.

At that time, I considered it a minor refinement, so I only incremented the patch version. However, in hindsight, it might have been more appropriate to update the major version. Anyway, this is an expected behavior.

mayuehit commented 3 weeks ago

您好,您的邮件已收到,我会尽快给您回复,谢谢。