Может ли компоновка памяти класса C ++ зависеть от рандомизации макета адресного пространства

Рассмотрим следующий класс C ++:

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

Компилятор, который я использую, создает представления этого класса таким образом, что порядок членов в памяти совпадает с порядком, который я использовал в определении класса. Недавно я столкнулся с программой, в которой этот факт использовался для инициализации участников. Я знаю, что это очень плохая идея, потому что компоновка зависит от компилятора, но я не писал код, и он работал до сих пор.

Мне подумалось, может ASLR функции в современных операционных системах могут испортить это. Я уверен, что это не тот случай, если объект создается динамически на heap, Но как насчет других случаев?

1

Решение

Нет … порядок в макете памяти гарантируется Стандартом, хотя между членами также может быть заполнение (всегда включается в sizeof результат, но это означает, что хакерский код, как вы описали, может захотеть использовать явную прагму для упаковки элементов данных или использовать offsetof для вычисления диапазона смещений для работы, в противном случае они могут нарушить некоторые другие настройки компилятора / компилятора, где макет отличается.

Отдельно расположение объектов одинаково независимо от того, где эти объекты созданы: глобальные переменные, стек, куча — это всегда одинаково. Учтите — offsetof является постоянной времени компиляции.

3

Другие решения

Других решений пока нет …