Рассмотрим следующий класс C ++:
class MyClass
{
TypeA a;
TypeB b;
TypeC c;
};
Компилятор, который я использую, создает представления этого класса таким образом, что порядок членов в памяти совпадает с порядком, который я использовал в определении класса. Недавно я столкнулся с программой, в которой этот факт использовался для инициализации участников. Я знаю, что это очень плохая идея, потому что компоновка зависит от компилятора, но я не писал код, и он работал до сих пор.
Мне подумалось, может ASLR
функции в современных операционных системах могут испортить это. Я уверен, что это не тот случай, если объект создается динамически на heap
, Но как насчет других случаев?
Нет … порядок в макете памяти гарантируется Стандартом, хотя между членами также может быть заполнение (всегда включается в sizeof
результат, но это означает, что хакерский код, как вы описали, может захотеть использовать явную прагму для упаковки элементов данных или использовать offsetof для вычисления диапазона смещений для работы, в противном случае они могут нарушить некоторые другие настройки компилятора / компилятора, где макет отличается.
Отдельно расположение объектов одинаково независимо от того, где эти объекты созданы: глобальные переменные, стек, куча — это всегда одинаково. Учтите — offsetof является постоянной времени компиляции.
Других решений пока нет …