【问题标题】:Can the memory layout of a C++ class be influenced by address space layout randomizationC++ 类的内存布局是否会受到地址空间布局随机化的影响
【发布时间】:2013-05-09 05:47:21
【问题描述】:

考虑以下 C++ 类:

class MyClass
{
    TypeA a;
    TypeB b;
    TypeC c;
};

我使用的编译器创建此类的表示形式,即内存中成员的顺序与我在类定义中使用的顺序相同。我最近遇到了一个程序,利用这个事实来初始化成员。我知道这是一个非常糟糕的主意,因为布局取决于编译器,但我没有编写代码并且到目前为止它仍然有效。

我想知道现代操作系统中的ASLR 功能是否会搞砸这一切。我很确定如果对象在heap 上动态实例化,情况并非如此。但是其他情况呢?

【问题讨论】:

    标签: c++ class memory-management aslr


    【解决方案1】:

    不...内存布局中的顺序由标准保证,尽管成员之间也可以有填充(总是包含在sizeof 结果中,但这确实意味着像您描述的那样的hacky代码可能想要使用显式编译指示来打包数据成员或使用 offsetof 来计算要操作的偏移范围,否则它们可能会在布局不同的一些其他编译器/编译器设置上中断。

    另外,对象的布局是相同的,无论这些对象是在哪里创建的:全局、堆栈、堆 - 它总是相同的。考虑 - offsetof 是一个编译时间常数。

    【讨论】:

    • 按照哪个标准? ANSI C?但据我了解,编译器对 ASLR 的作用没有影响。我怎么知道 ASLR 不会混淆我的静态类表示?
    • @koloman ISO/IEC 14882:2011(E),当前有效的 C++ 标准。请参阅[intro.object]§5,尤其是[class.mem]§14
    • (感谢 Angew)koloman:ASLR 在这个级别不起作用......来自维基百科,它“通常包括可执行文件的基础以及库、堆和堆栈的位置,在进程的地址中空间。”因此,它是总内存区域随机化,而不是对象内随机化。
    猜你喜欢
    • 2019-03-22
    • 2020-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    相关资源
    最近更新 更多