CleverRaven / Cataclysm-DDA

Cataclysm - Dark Days Ahead. A turn-based survival game set in a post-apocalyptic world.
http://cataclysmdda.org
Other
10.26k stars 4.12k forks source link

segfault on save somewhere with items in vehicles. #75907

Open akrieger opened 3 weeks ago

akrieger commented 3 weeks ago

Describe the bug

CRASH LOG FILE: ./config/crash.log
VERSION: 0.I
TYPE: Signal
MESSAGE: SIGSEGV: Segmentation fault
STACK TRACE:

    0   cataclysm-tiles                     0x00000001049621c4 debug_write_backtrace(std::__1::basic_ostream<char, std::__1::char_traits<char>>&) + 72
    1   cataclysm-tiles                     0x0000000104921270 log_crash(char const*, char const*) + 440
    2   cataclysm-tiles                     0x0000000105af1e14 signal_handler(int) (.cold.1) + 48
    3   cataclysm-tiles                     0x0000000104920fac crash_terminate_handler() + 0
    4   libsystem_platform.dylib            0x0000000195c1a584 _sigtramp + 56
    5   cataclysm-tiles                     0x0000000104e17d48 item_location::impl::item_on_vehicle::position() const + 32
    6   cataclysm-tiles                     0x0000000104e184e8 item_location::impl::item_on_vehicle::serialize(JsonOut&) const + 112
    7   cataclysm-tiles                     0x0000000104cd48c0 advanced_inv_pane_save_state::serialize(JsonOut&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&) const + 1080
    8   cataclysm-tiles                     0x0000000104cb6f70 advanced_inv_save_state::serialize(JsonOut&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&) const + 1568
    9   cataclysm-tiles                     0x0000000104cb6150 uistatedata::serialize(JsonOut&) const + 84
    10  cataclysm-tiles                     0x0000000104bb26e4 std::__1::__function::__func<game::save()::$_0, std::__1::allocator<game::save()::$_0>, void (std::__1::basic_ostream<char, std::__1::char_traits<char>>&)>::operator()(std::__1::basic_ostream<char, std::__1::char_traits<char>>&) + 48
    11  cataclysm-tiles                     0x000000010471a404 write_to_file(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::function<void (std::__1::basic_ostream<char, std::__1::char_traits<char>>&)> const&) + 132
    12  cataclysm-tiles                     0x000000010471a4b8 write_to_file(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::function<void (std::__1::basic_ostream<char, std::__1::char_traits<char>>&)> const&, char const*) + 36
    13  cataclysm-tiles                     0x0000000104b6be4c game::save() + 312
    14  cataclysm-tiles                     0x0000000104b996b0 game::quicksave() + 148
    15  cataclysm-tiles                     0x0000000104c0b980 game::do_regular_action(action_id&, avatar&, std::__1::optional<tripoint> const&) + 3388
    16  cataclysm-tiles                     0x0000000104c15a6c game::handle_action() + 668
    17  cataclysm-tiles                     0x0000000104a11578 do_turn() + 2424
    18  cataclysm-tiles                     0x0000000104f7b1d0 main + 3880
    19  dyld                                0x000000019585f154 start + 2476

Attach save file

IDK if this will repro because it happened mid-save so my save is probably corrupt now. 2kumo4me 2.zip

Steps to reproduce

Play game. Save. It crashes?

Expected behavior

No crash on save?

Screenshots

No response

Versions and configuration

changeset:   45f35ecb556eae10b78997257765a40795c2784f   (@)
parent:      4bf90cd464f6d099004e98bd24be4aed1d931a82
user:        Standing-Storm <120433252+Standing-Storm@users.noreply.github.com>
date:        Tue, 13 Aug 2024 16:56:22 -0700

    [Xedra Evolved] Turn activated learn-recipe Paraclesian traits into Passive ones (#75629)

Additional context

No response

PatrikLundell commented 3 weeks ago

Failed to reproduce.

So, no luck this time...

However, it seems item_location::impl::item_on_vehicle::position() might blow up if called on a vehicle_cursor created with ignore_vpart = true. It seems odd to use part if ignore_vpart was set to true, and I wouldn't be shocked if part was set to -1 in such a case. I would suggest replacing

tripoint position() const override {
    return cur.veh.global_part_pos3( cur.part );
}

with

tripoint position() const override {
    if (ignore_vpart) {
        return cur.veh.pos_bub().raw();
    }
    else {
        return cur.veh.global_part_pos3( cur.part );
    }
}