c++类的内存布局是否会受到地址空间布局随机化的影响?
Can the memory layout of a C++ class be influenced by address space layout randomization
考虑以下c++类:
class MyClass
{
TypeA a;
TypeB b;
TypeC c;
};
我使用的编译器以一种方式创建该类的表示,即内存中成员的顺序与我在类定义中使用的顺序相同。我最近遇到了一个程序,其中利用了这一事实来初始化成员。我知道这是一个非常糟糕的主意,因为布局取决于编译器,但我没有写代码,它到目前为止工作。
我想知道现代操作系统中的ASLR
功能是否会把这搞砸。我很确定,如果对象在heap
上动态实例化,则不是这种情况。但其他情况呢?
不…内存布局中的顺序是由标准保证的,虽然成员之间也可以填充(总是包含在sizeof
结果中,但这确实意味着像你所描述的那样的黑客代码可能想要使用显式的pragma来打包数据成员或使用offsetof来计算要操作的偏移范围,否则它们可能会在布局不同的其他编译器/编译器设置上破坏。
单独来说,对象的布局是相同的,无论这些对象在哪里创建:全局,堆栈,堆-它总是相同的。考虑- offsetof是一个编译时常量
相关文章:
- 将布局映射到内存地址
- C++/地址空间:每个地址 2 个字节?
- 任务管理器 - C/C++ 应用程序 - 分配的地址空间与已用内存
- size_t ptrdiff_t和地址空间
- C++中是否有一个函数可以为您获取指向该节点的所有指针的地址空间
- 如何以包装的方式初始化布局,从而减少布局之间的空间
- 加载地址 X 时,对于 Y 类型的对象没有足够的空间
- ptrA = ptrB 是否等同于 ptrA = &*ptrB?,空值是否共享一个地址空间?
- 获取封装在命名空间中的静态变量地址
- 优化大型地址空间上的循环
- 分配空间时,我会收到非常不同的地址
- 如何表示指向地址空间开头的指针
- 从某个特定但很大的虚拟地址空间(例如,20GB以上)分配内存
- 内存是如何布局的?地址在哪个方向变大?使用联合
- Do C和C++标准意味着地址空间中必须只存在一个特殊值来表示空指针的值
- 使用mprotect保护整个地址空间
- 关于取消引用和地址空间的基本C++指针问题
- c++类的内存布局是否会受到地址空间布局随机化的影响?
- elf 文件中 .bss 节空间的地址空间
- 如何查找进程地址空间的地址?