Delphi 64-бит: поиск неправильных настроек?

Я работаю над тем, чтобы адаптировать большую базу кода Delphi к 64-битным. Во многих случаях существуют строки, в которых указатели накладываются на/из 32-битных значений, подобных этому:

var
  p1,p2 : pointer;
begin
  inc(Integer(p1),10);
  p2 := Pointer(Integer(p1) + 42);

Где я могу найти эти приведения, я заменил их с помощью NativeInt-casts, чтобы сделать их правильными в 64-битном режиме.

Однако я не уверен, что нашел их всех. Иногда приведения более тонкие, поэтому просто поиск текста для строки "integer" ( "тоже недостаточно".

Так как "integer" ("casts failed in 64-bit, если значение указателя превышает диапазон целочисленного типа, у меня есть идея: что, если я могу заставить диспетчер памяти выделить память выше 4gb (так что значения указателя используют более 32 бит)? Тогда я получаю ошибки во время выполнения и может с легкостью находить ошибки, которые являются неправильными. Это возможно? Или кто-нибудь может порекомендовать какую-то другую технику?

Ответы

Ответ 1

Нет никакого волшебного трюка для поиска этих отливок за пределами того текстового поиска, который вы используете. Было бы очень приятно, если бы компилятор предупредил об этом. Мне очень жаль, что это не так.

Когда вы обнаружите такую ​​проблему, не меняйте ее на NativeInt. Измените указатели для ввода указателей и используйте арифметику указателей.

var
  p1, p2: PByte;
....
inc(p1, 10);
p2 := p2;
inc(p2, 42);

Тогда ваш код будет безопасным навсегда.

Есть еще некоторые ситуации, когда вам нужно отличать целые числа. Например, при передаче адресов SendMessage. Но примените их как к WPARAM, так и к LPARAM.

Ваша идея заставлять ошибки во время работы звучит и, к счастью, для вас, а не оригинально! Вы должны использовать полную версию FastMM и определить AlwaysAllocateTopDown. Это вызывает вызовы, которые FastMM делает для VirtualAlloc для передачи флага MEM_TOP_DOWN. Это приведет к удалению большинства ваших ошибочных отбросов как ошибок усечения указателя времени выполнения.

Однако это приведет только к отключению сверху вниз для памяти, выделенной вашим менеджером памяти. Другие модули в вашем процессе будут использовать политику по умолчанию снизу вверх. Вы можете установить настройку машины для изменения этой политики по умолчанию. Установите HKLM\System\CurrentControlSet\Control\Session Manager\Memory Management\AllocationPreference в REG_DWORD со значением 0x100000 и перезагрузитесь.

Обратите внимание, что это может привести к проблемам со стабильностью. Многие приложения не могут справиться с этим. В частности, очень мало антивирусных продуктов, которые могут справиться с этой настройкой. MSE - это тот, который я нашел, работает с распределением сверху вниз сверху вниз. Что еще 64-разрядный отладчик не работает при распределении сверху вниз! Таким образом, вы должны выполнить такой тип тестирования без отладчика. Мой отчет QC по-прежнему открыт, и эта проблема не устранена даже в XE3.