【发布时间】:2019-04-28 07:58:10
【问题描述】:
我正在使用 UBSAN 并收到以下错误。请注意,我正在使用带有 -fsanitize=undefined 的 clang 6.0.1 进行编译。我已经阅读了一些关于 SO 的背景问题,但仍然无法解决我的特定问题。以下是供参考的背景问题:
- What is the recommended way to align memory in C++11
-
Misaligned address using virtual inheritance
运行时错误:对于类型“const A *”的未对齐地址 0x000001f67230 的成员调用,需要 64 字节对齐 0x000001f67230:注意:指针指向这里 00 00 00 00 c0 72 f6 01 00 00 00 00 08 00 00 00 00 02 00 00 40 02 00 00 00 00 00 00 00 00 00 00
以下是关于 C 类的一些注意事项:
- C 类型的对象是使用
new(C* o = new C();) 创建的 - 类型 C 具有类型 A 的成员,该成员具有 64 字节对齐。我使用 alignof 验证了这一点。
- C 是使用
class alignas(64) C声明的——但这并不能解决我的问题
我目前的假设是我需要使用 C++11 等效的 C++17 std::aligned_alloc 来使用对齐存储创建对象。但是,我不确定如何最好地做到这一点,或者它是否真的能解决我的问题。如果可能的话,我宁愿在 C 类的定义中解决一次问题,而不是每次创建 C 时。解决此问题以消除 UBSAN 错误的推荐方法是什么?
【问题讨论】:
-
听起来你在正确的轨道上,扩展对齐通常是实现定义的,可能需要一些手握。甚至 C++17 的扩展对齐支持最终都是由实现定义的,您的实现可能会或可能不会为 64 调用
aligned_alloc。(C++17 中的新功能是您的实现可能现在调用 @ 987654328@.)