Сегодня ночью ShadPS4 присоединится к охоте — так начинается история о том, как самый популярный эмулятор PlayStation 4 наконец позволил запустить Bloodborne на ПК. Но прежде чем радоваться, давайте заглянем под капот этого проекта. Я провёл разбор кода эмулятора (коммит 24e68ba main-ветки, без сторонних библиотек) и нашёл немало интересного — от безобидных мелочей до настоящих бомб замедленного действия. Всем контрибуторам ShadPS4 — огромная благодарность, но охота есть охота.
Первый фрагмент — «Fear your blindness». В файле input_handler.h обнаружился выход за границу буфера. Ошибка прожила в проекте полтора года, пока её случайно не исправили. Классический случай, когда глаз автора замылился при добавлении большой порции кода.
Второй фрагмент — «No mercy for “Liar”». В avplayer_source.cpp проверка условия всегда истинна, потому что беззнаковый тип сравнивается с нулём. Если копнуть глубже, видно, что раньше поле было знаковым, а после рефакторинга проверка стала тавтологией. Похоже на опечатку, которую скопипастили из одной функции в другую.
Третий фрагмент — «Let us cleanse these foul streets». В aio.cpp при вызове функции обнуления буфера передаётся sizeof(выражение), которое возвращает размер указателя (4 или 8 байт), а не размер всего массива. В итоге обнуляется только часть. Скорее всего, хотели очистить весь буфер целиком.
Четвёртый фрагмент — «Beware of “Attack from behind”». Макрос логирования разыменовывает указатель до проверки на nullptr. В release-сборке вызов происходит, а проверка — уже внутри. Разработчик добавил код после макроса, но не заметил, что безусловное разыменование может упасть.
Пятый фрагмент — «Oh, Yourself, please, carry on in my stead». В text_editor.cpp переменной дважды присваивается одно и то же значение. Похоже на копипасту декларатора с инициализатором из соседней строки. Возможно, хотели присвоить что-то другое, но логика алгоритма этого не подтверждает.
Шестой фрагмент — «Treat “The unseen” with care». В liverpool_to_vk.cpp из-за приоритета операций выражение интерпретируется не так, как задумано. Ошибки нет, но код хрупкий — будущий разработчик может легко оступиться.
Седьмой фрагмент — «“Strong foe” waits ahead but “don’t give up”». В decoder.cpp в функцию декодирования инструкций передают размер указателя вместо размера буфера. Это похоже на реальную ошибку: похожий код нашли и выпилили ещё в 2023 году, а в другом эмуляторе PS4 использовали корректное значение 15.
Восьмой фрагмент — «Despicable “Metamorphosis” therefore fear “Moon”». В playgo.cpp сдвиг на 32 и более бита для 32-битного числа вызывает неопределённое поведение. При этом значения, приходящие из игр, часто меньше 32, например, японский язык — это 0. Так что любая японская игра гарантированно вызовет переполнение.
Девятый фрагмент — «Time for “Hidden path”». В hull_shader_transform.cpp пропущен оператор break в switch. Похоже, что разработчик намеренно игнорировал один случай, но не оставил комментария, и теперь поведение непредсказуемо.
Десятый фрагмент — «Treat “Lever” with care or you must accept “Ignoring”». В np_common.cpp сравнение строк всегда возвращает ложь, потому что используется беззнаковый тип, который не может быть меньше нуля. Опечатка в типе.
Одиннадцатый фрагмент — «The sky and the cosmos are one». В форке эмулятора, заточенного под Bloodborne, условие проверки дельты времени содержит лишнюю часть. В upstream есть похожий фрагмент с защитой от пролагов, но здесь она реализована некорректно.
Это лишь часть найденного. Код эмулятора — живой и активно развивающийся, но такие ошибки напоминают: даже самые талантливые разработчики иногда спотыкаются. Статический анализ помогает охотиться на эти баги до того, как они выстрелят в пользователей.
А как вы считаете, стоит ли доверять эмуляторам для игры в эксклюзивы, или лучше приобрести оригинальную консоль? Поделитесь своим мнением в комментариях!
| # | Наименование новости | Тональность | Информативность | Дата публикации |
|---|---|---|---|---|
| 1 | Запуск Verilog на микроконтроллере CH32V003 (ядро RISC-V) ( Аппаратная эмуляция ... | 0 | 10.76 | 24-08-2026 |
| 2 | Мой код терял бы 230 байт из 231. Чтобы это увидеть, пришлось патчить QEMU | -1 | 10.63 | 02-08-2026 |
| 3 | Эмулятор PlayStation 5 научился запускать 3D-игры Разработчики KytyPS5 сообщили, что ... | 5 | 7 | 13-07-2026 |
| 4 | Sony seemingly enforcing "stricter guidelines" on PlayStation Store to remove the mounds of PS5 shovelware games accumulating there | 0 | 5 | 24-06-2026 |
| 5 | PlayStation Plus Extra/Premium Games For August 2026 Includes Helldivers 2 | 0 | 12.62 | 12-08-2026 |
| 6 | Move‑семантика в C++: пять задач, в которых легко ошибиться | 0 | 8.62 | 23-06-2026 |
| 7 | Новая статья: Gamesblender 788: шейхи купили EA, реклама на PlayStation, ... | 0 | 8.57 | 09-08-2026 |
| 8 | Почему страх в старых играх работал? | 0 | 12.32 | 26-07-2026 |
| 9 | [Перевод] Проектируем с нуля калькулятор на FPGA. Часть 9: погоня за последним разрядом | 0 | 11.26 | 24-07-2026 |