[bug] Загрузка состояния принимает NaN/inf, а сценарий очищает сцену до проверки тела #86

Closed
opened 2026-10-30 10:29:41 +00:00 by chexit · 1 comment
Owner

🤖 Filed by Codex, AI-агент Владимира (chexit).

Архитектурный проход по 76f680eba64b64eb28435e71ce9f22a84b0e5da1.

Что есть сейчас

lib.rs::apply_state разбирает позиционные строки и возвращает (): parse::<f64>() допускает NaN/inf, ошибочные строки молча пропускаются. scenario.rs::apply_scenario проверяет заголовок и мир, затем очищает текущую расстановку и только после этого вызывает такой разбор тела, после чего сообщает успех.

Native characterization test на отдельной копии загрузил:

target NaN inf 0 -100
sam s400 NaN 70 0 0

Результат: объект (NaN, inf, 0) с HP -100 и SAM с NaN-координатой реально добавлены. Это дефект устойчивости к повреждённому/редактированному состоянию; удалённый exploit не заявляется. Для частично повреждённого сценария риск потерять текущую расстановку следует из порядка операций, отдельно host-загрузка не запускалась.

Предложение

  • Разбирать сначала в LayoutSnapshot/DTO: версия, конечность координат/углов, допустимые HP/роли/боезапас, лимиты сущностей и уникальность устойчивых ID/ссылок.
  • Проверить весь документ и только затем атомарно заменить сцену. На ошибке сохранить старую сцену и указать строку/поле. Не оставлять половину загрузки.
  • Развести расстановку, стартовый сценарий и возможный сейв боя. Сейчас seed восстанавливает только sim.rng, тогда как отдельный Sim.seed, tick, next ID и часть истории сессии продолжают жить. Явно определить, что сбрасывается при повторном старте; не обещать полное восстановление боя из layout.
  • Сохранить чтение старых корректных форматов через явные миграции. Не обязательно вводить тяжёлый сериализатор: важны схема, валидация и commit после parse.

Приёмка

Тесты: NaN/±inf, обрезанная строка, неверный kind, невозможные HP, невалидная ссылка/версия; ни один отказ не меняет активную сцену. Корректный старый сейв читается. Перезапуск сценария с тем же seed имеет определённую и проверяемую семантику независимо от ранее сыгранного боя. Индекс сценариев и payload не должны молча расходиться при неудачной записи.

Общий порядок и зависимости: архитектурная дорожная карта.

🤖 Filed by Codex, AI-агент Владимира (chexit). Архитектурный проход по `76f680eba64b64eb28435e71ce9f22a84b0e5da1`. ### Что есть сейчас `lib.rs::apply_state` разбирает позиционные строки и возвращает `()`: `parse::<f64>()` допускает NaN/inf, ошибочные строки молча пропускаются. `scenario.rs::apply_scenario` проверяет заголовок и мир, затем очищает текущую расстановку и только после этого вызывает такой разбор тела, после чего сообщает успех. Native characterization test на отдельной копии загрузил: ``` target NaN inf 0 -100 sam s400 NaN 70 0 0 ``` Результат: объект `(NaN, inf, 0)` с HP `-100` и SAM с NaN-координатой реально добавлены. Это дефект устойчивости к повреждённому/редактированному состоянию; удалённый exploit не заявляется. Для частично повреждённого сценария риск потерять текущую расстановку следует из порядка операций, отдельно host-загрузка не запускалась. ### Предложение - Разбирать сначала в `LayoutSnapshot`/DTO: версия, конечность координат/углов, допустимые HP/роли/боезапас, лимиты сущностей и уникальность устойчивых ID/ссылок. - Проверить весь документ и только затем атомарно заменить сцену. На ошибке сохранить старую сцену и указать строку/поле. Не оставлять половину загрузки. - Развести **расстановку**, **стартовый сценарий** и возможный **сейв боя**. Сейчас seed восстанавливает только `sim.rng`, тогда как отдельный `Sim.seed`, tick, next ID и часть истории сессии продолжают жить. Явно определить, что сбрасывается при повторном старте; не обещать полное восстановление боя из layout. - Сохранить чтение старых корректных форматов через явные миграции. Не обязательно вводить тяжёлый сериализатор: важны схема, валидация и commit после parse. ### Приёмка Тесты: NaN/±inf, обрезанная строка, неверный kind, невозможные HP, невалидная ссылка/версия; ни один отказ не меняет активную сцену. Корректный старый сейв читается. Перезапуск сценария с тем же seed имеет определённую и проверяемую семантику независимо от ранее сыгранного боя. Индекс сценариев и payload не должны молча расходиться при неудачной записи. Общий порядок и зависимости: [архитектурная дорожная карта](https://gitea.maoniao.team/chexit/airdef/issues/103).
chexit added the area:architecturetype:bugpriority:P2area:persistence labels 2026-10-30 10:29:41 +00:00
Author
Owner

🤖 Agent: сделано в b43d471706 (запушено в main). Проверено нативными тестами, в игре не запускалось.

🤖 Agent: сделано в https://gitea.maoniao.team/chexit/airdef/commit/b43d47170626e5a403d4c210246cce8fd4b763bc (запушено в main). Проверено нативными тестами, в игре не запускалось.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chexit/airdef#86