(Я прошу прощения, если это неправильное место, чтобы спросить об этом. Я думаю, что это определенно связано с программированием, хотя, если это принадлежит на каком-либо другом сайте, пожалуйста, дайте мне знать)
Я вырос, играя в Pokémon Red and Blue, игры, которые были очень забавны, но несколько печально известны наличием многочисленных эксплуатационных сбоев (например, см. этот нелепый speedrun игра, которая использует повреждение памяти, чтобы превратить экран элемента в шестнадцатеричный редактор).
Недавно я нашел интересную скорость игры, которая использует глюк, называемый "ZZAZZ glitch", чтобы повредить важные места памяти и позволить игроку почти сразу выиграть игру. Согласно автору описания ускорения, сбой ZZAZZ работает следующим образом:
Чтобы начать битву с тренером, игра должна загружать много данных, таких как [...] деньги, которые он уступит, если победят. Когда он загружает деньги, где все может стать действительно уродливым. По причинам, которые выходят за рамки меня, деньги хранятся совершенно по-другому, игра использует структуру данных из трех байтов и вместо преобразования значения в двоичный файл хранит ее в "человеческом" представлении. Например, $123456 будет храниться как 0x123456 вместо 0x01E240, правильное преобразование.
[Некоторые недопустимые записи в таблице тренера] указывают на местоположение с недопустимыми денежными данными. Когда игра пытается выполнить арифметику с этими данными в указанной структуре, она гаснет и начинает перезаписывать огромные части ОЗУ. Более конкретно, для каждого блока из трех байтов два из них будут содержать 0x9999 (максимальная сумма денег, которую может дать тренер). Эта модель повторяется много раз через ОЗУ. Чтобы это было лучше, я рекомендую приостановить видео на эмуляторе после того, как тренер ZZAZZ столкнулся, и установите средство просмотра памяти VBA на 0xD070.
Этот анализ имеет смысл, но поскольку я программист, я не могу не задаться вопросом, как программисты написали код, который сделает это возможным. Без подхода, который я могу придумать для написания функции, которая преобразует десятичное число с шестнадцатеричным кодированием в десятичный, никогда не начнет заполнять случайные блоки памяти 0x9999, если вход не был допустимым десятичным числом с шестнадцатеричным кодированием.
Мой вопрос заключается в том, что, не конструируя алгоритм так неудачно, существует простая реализация преобразования из десятичного десятичного кода в десятичный код, что может привести к повреждению памяти такого рода при подаче недопустимого значения
Опять же, если это не по теме, мои извинения. Мои мысли в том, что другие программисты на этом сайте, возможно, тоже выросли, играя в эту игру, и это звучит как интересное упражнение в обратном инжиниринге, чтобы попытаться понять, как такой глюк может быть возможен.