Ответ 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.