native SubString takes string source, integer start, integer end returns string
- вот пример исполнения кода:
код - результат
SubString("123456789",0,99) - 123456789
SubString("123456789",-1,99) - o123456789
SubString("123456789",-2,99) - mo123456789
SubString("123456789",-3,99) - mo123456789
SubString("123456789",-4,99) - mo123456789
SubString("123456789",-5,99) - (null)
зачем этот префикс "mo" при старте с "-1" по "-4" ?
- в одной из карт есть такой код:
if SubString("|",-1,0)!="o" and GetUnitTypeId(BackGroundUnits[i])!='hspt' then
call SetUnitScale(BackGroundUnits[i],4,4,4)
endif
в чём смысл проверять подстроку на наличие "o" в -1 позиции?
Принятый ответ
Менеджер памяти варкрафта размещает перед каждой выделеной единицей памяти служебные данные. Непосредственно перед строкой находятся 16 байт, содержащие старшие два байта адреса текущего региона памяти, за которыми следует константа 0x6F6D ("mo"), которая, вероятно, является маркером, нужным для проверок блока на правильность во время освобождения.
Нативка SubString позволяет читать память перед строкой с минимальным рабочим индексом равным -32768. Если дотянуться до незанятой памяти, то должно быть возможно и крашнуть игру.
Проверка, что символ перед строкой не равен букве "o" всегда будет возвращать false, если только кто-нибудь не сделает мод, который заменит стандартный менеджер памяти на альтернативный, что может привести к изменению содержимого служебной памяти перед строкой.
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Ред. host_pi
Ред. host_pi
SubString позволяет по памяти ковыряться
если через чат вводить значения отступа XX от -20 и условно до -20000 (и дальше)
выдаваемые значения обычно разные, даже если одну и ту же карту перезапустить
IceFog: