【问题标题】:how to correctly cast uint32_t to unsigned如何正确地将 uint32_t 转换为无符号
【发布时间】:2018-02-24 00:04:15
【问题描述】:

我正在尝试使用地址清理程序修复一些 C++ 代码。 代码说:

unsigned result = *(uint32_t*)data;

而消毒剂给出:

runtime error: load of misaligned address 0x6280033f410a for type 'uint32_t', which requires 4 byte alignment

我需要如何解决这个问题?

【问题讨论】:

  • memcpy 指向真实uint32_t 的指针,然后将其转换为unsigned
  • 你为什么用那个演员表?
  • data是什么类型?
  • 这个问题显然不是关于“如何投射”的。而且它似乎与“cast to unsigned”无关。问题在于如何读取未对齐的数据。所以,请确认:您真的打算读取未对齐的数据吗?是不是应该错位了?为什么它会错位?它是如何以这种方式结束的?
  • 我怀疑标题与实际要求不符

标签: c++ c++11 ubsan address-sanitizer


【解决方案1】:
load of misaligned address 0x6280033f410a for type 'uint32_t' ...

我需要如何解决这个问题?

你需要创建一个对齐的对象(比如一个变量),并从未对齐的地址复制内容:

std::uint32_t u32;
std::memcpy(&u32, data, sizeof u32);

这假设您打算从该地址读取 sizeof u32 字节,并且这些字节按本机字节序排列。

如何正确地将 uint32_t 转换为无符号

隐式转换应该没问题:

unsigned result = u32;

【讨论】:

  • 非常感谢,std::uint32_t u32; std::memcpy(&u32, data, sizeof u32); 解决了这个问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-06
  • 1970-01-01
  • 1970-01-01
  • 2020-11-01
  • 1970-01-01
  • 2018-07-19
  • 2021-11-21
相关资源
最近更新 更多