17
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-11-12 14:01:02 +01:00

fix: the bugs and vulnerabilities SonarCloud reports on PR #216

This commit is contained in:
2026-11-07 22:11:08 +01:00
parent 8e85def98f
commit 7667e5b2ec
65 changed files with 910 additions and 121 deletions

29
pr-reviews/PR-159.md Normal file
View File

@@ -0,0 +1,29 @@
# Review PR #159 — Trainset spawning, various Lua scripting changes
Autor: @jakubg1 · base: `master` · 10 plików, +65/−38 · ostatnia aktualizacja 21.10
https://github.com/MaSzyna-EU07/maszyna/pull/159
**Werdykt: Request changes — otwarte uwagi z rundy 21.10 nadal aktualne**
## Podsumowanie
- `api.spawn_trainset(trainset)` w Lua — cały wpis `trainset … endtrainset` jak ze Startera.
- `state_serializer::insert_trainset_full()`.
- Rejestracja źródeł dymu i świateł pojazdu przeniesiona z `deserialize_node()` do `TDynamicObject::Init()` (`init_smoke_sources()`), więc działa też dla pojazdów wstawianych w trakcie symulacji.
- `insert_trainset()` dostaje parametr `Velocity`.
## Co sprawdziłem
- Warunek świateł w `Init()` ma już poprawne nawiasy (`CategoryFlag == 1 && (front || rear)`) — uwaga @jerrrrycho z 04.09 zaadresowana. ✔
- `Init()` zwraca `0.0` (porażka, pojazd jest potem kasowany) tylko przed `TurnOff()`, czyli przed nową rejestracją dymu/świateł — więc brak wiszących wskaźników w `Particles`/`Lights`. ✔ Wyjątek: pojazd z `Dim.L == 0` w `.fiz` przejdzie rejestrację, a potem zostanie usunięty jako „błąd”. Rzadkie, ale warto zabezpieczyć (rejestrować po sprawdzeniu długości albo wyrejestrować przy `delete`).
## Uwagi blokujące (z poprzedniej rundy, wciąż w kodzie)
1. **Pętla w `insert_trainset_full()` nie zatrzymuje się na `endtrainset`.** Przykład @jerrrrycho: dwa składy w jednym stringu → oba wylądują na torze pierwszego. Do tego brak `endtrainset` nie daje błędu, a skład zostaje „w połowie”. Proponuję: czytać `node` aż do `endtrainset`; jeśli go nie ma — `ErrorLog` i usunąć już utworzone pojazdy (albo jasno udokumentować, że zostają).
2. **`lua_tostring()` może zwrócić `NULL`** (argument nie jest stringiem/liczbą) → `std::string` z `nullptr` = UB/crash. Zapowiedziany osobny PR dla wszystkich funkcji API jest OK, ale dla nowej funkcji to jedna linia: `luaL_checkstring(L, 1)`.
3. **Unikalne nazwy pojazdów.** Ponowne wywołanie z tym samym wpisem tworzy duplikaty nazw (`Vehicles.insert` zwróci `false`, log „duplicate vehicle name”), a pojazd i tak zostaje w świecie. Dla API skryptowego, które *z założenia* będzie wołane wielokrotnie, warto automatyczny sufiks albo jawny błąd i odrzucenie.
## Pozostałe uwagi
4. **Parametr `Velocity` w `insert_trainset()`** — oba wywołania podają `0`, a `insert_trainset_full()` go nie używa. Jeśli to przygotowanie pod przyszłość — lepiej dodać go w PR, który go użyje (YAGNI).
5. **`init_smoke_sources() const`** — metoda `const`, która rejestruje `this` w globalnym menedżerze cząsteczek. Kompiluje się (jest przeciążenie `insert(…, TDynamicObject const*, …)`), ale semantycznie to efekt uboczny; bez `const` będzie czytelniej.
6. **Synchroniczne ładowanie** (zamrożenie przy spawnie) — zaakceptowane w dyskusji; warto dopisać to w dokumentacji funkcji Lua.
7. **Test dymu i świateł** — @jakubg1 sam prosił o sprawdzenie, że dym i światła pojawiają się poprawnie. Proszę o potwierdzenie (np. zrzut parowozu z dymem i składu z oświetleniem czoła) zarówno dla scenerii wczytanej, jak i składu ze `spawn_trainset`.
8. **Tytuł/opis**: „various Lua scripting changes”, a dochodzi jedna funkcja — opis do zaktualizowania. Historia commitów jest pomieszana (autor sam to pisze), więc squash przy merge.
9. Formatowanie: mieszane tabulatory/spacje w `DynObj.h` i `simulationstateserializer.cpp` (`if (!vehicle)` + tab).