Windows: указатель уникальности - PullRequest
2 голосов
/ 16 сентября 2011

Мне понадобился быстрый уникальный идентификатор в одном из моих классов, чтобы отличать один процесс от другого.Я решил использовать адрес экземпляра для этого.В итоге получилось что-то вроде этого (quintptr - это целочисленный тип Qt для хранения адресов правильного размера в соответствии с платформой):

Foo::Foo()
: _id(reinterpret_cast<quintptr>(this))
{
 ...
}

Идея состоит в том, чтобы сравнить выходные данные двухразные процессы одного и того же exe.На Vista (моей машине для разработчиков) проблем нет.Но в XP значение _id одинаково (!) В двух процессах.

Кто-нибудь может объяснить, почему это так?и если будет хорошей идеей использовать такие указатели (я так думал, я больше не уверен)?

Спасибо.

Ответы [ 3 ]

7 голосов
/ 16 сентября 2011

Каждый процесс получает свое собственное адресное пространство. На XP они все одинаковые. Поэтому очень часто можно увидеть то, что вы видели: два объекта с одинаковым адресом, но в двух разных адресных пространствах.

Оказывается, это способствует угрозам безопасности. Злоумышленники смогли угадать, где в памяти будут находиться уязвимые объекты, и использовать их. Vista рандомизирует адресные пространства (ASLR), что означает, что два процесса с большей вероятностью помещают один и тот же объект по разным адресам.

В вашем случае использование таких указателей не является разумной идеей. Просто используйте идентификатор процесса

3 голосов
/ 16 сентября 2011

Причина в том, что каждый процесс имеет свое собственное адресное пространство, и если два процесса делают одно и то же, они просто используют одни и те же виртуальные адреса - возможно, даже выделение кучи будет осуществляться по одним и тем же виртуальным адресам.

Вы можете вызвать GetCurrentProcessId() один раз и сохранить результат где-нибудь, чтобы дальнейший поиск был очень быстрым. Идентификатор процесса сохраняется и является уникальным в течение всего жизненного цикла процесса.

1 голос
/ 16 сентября 2011

Каждый процесс получает свое собственное адресное пространство. Если не произойдет что-то вроде ASLR , схемы памяти двух процессов, происходящих из одного и того же исполняемого файла, вероятно, будут очень похожи, если не идентичны.

Так что ваша идея не очень хорошая. Использование идентификатора процесса звучит здесь как более разумный подход, но имейте в виду, что они тоже могут быть переработаны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...