Zylann / godot_voxel

Voxel module for Godot Engine
MIT License
2.59k stars 244 forks source link

Crash when using test projet #253

Closed qarmin closed 2 years ago

qarmin commented 3 years ago

Voxel version - 2b202cf07c8bc1429db7d22eb4c4e1f63318a023

When running https://github.com/qarmin/RegressionTestProject/archive/refs/heads/3.x.zip with Godot and this plugin compiled with address sanitizer, then I got this error messages:

modules/voxel/meshers/transvoxel/../../constants/../util/math/vector3i.h:222:42: runtime error: left shift of negative value -5
modules/voxel/meshers/transvoxel/../../constants/../util/math/vector3i.h:222:32: runtime error: left shift of negative value -5
modules/voxel/meshers/transvoxel/../../constants/../util/math/vector3i.h:222:22: runtime error: left shift of negative value -5

and this crashes

VoxelGeneratorGraph.remove_node
Parameters [100]
ERROR: get_node: FATAL: Condition "it == _nodes.end()" is true.
   At: modules/voxel/generators/graph/program_graph.cpp:151.
handle_crash: Program crashed with signal 4
Dumping the backtrace. Please include this when reporting the bug on https://github.com/godotengine/godot/issues
[1] /mnt/Miecz/godot3.2/bin/godot.x11.tools.64s() [0x187a2f0] (/mnt/Miecz/godot3.2/platform/x11/crash_handler_x11.cpp:54)
[2] /lib/x86_64-linux-gnu/libc.so.6(+0x46210) [0x7f0a3c02b210] (??:0)
[3] ProgramGraph::get_node(unsigned int) const (/mnt/Miecz/godot3.2/modules/voxel/generators/graph/program_graph.cpp:151 (discriminator 1))
[4] ProgramGraph::remove_node(unsigned int) (/mnt/Miecz/godot3.2/modules/voxel/generators/graph/program_graph.cpp:58)
[5] VoxelGeneratorGraph::remove_node(unsigned int) (/mnt/Miecz/godot3.2/modules/voxel/generators/graph/voxel_generator_graph.cpp:58)
[6] MethodBind1<unsigned int>::call(Object*, Variant const**, int, Variant::CallError&) (/mnt/Miecz/godot3.2/./core/method_bind.gen.inc:775 (discriminator 12))
[7] Object::call(StringName const&, Variant const**, int, Variant::CallError&) (/mnt/Miecz/godot3.2/core/object.cpp:919 (discriminator 1))
[8] Object::callv(StringName const&, Array const&) (/mnt/Miecz/godot3.2/core/object.cpp:826 (discriminator 1))
[9] MethodBind2R<Variant, StringName const&, Array const&>::call(Object*, Variant const**, int, Variant::CallError&) (/mnt/Miecz/godot3.2/./core/method_bind.gen.inc:1717 (discriminator 12))
[10] Object::call(StringName const&, Variant const**, int, Variant::CallError&) (/mnt/Miecz/godot3.2/core/object.cpp:919 (discriminator 1))
[11] Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) (/mnt/Miecz/godot3.2/core/variant_call.cpp:1149 (discriminator 1))
[12] GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) (/mnt/Miecz/godot3.2/modules/gdscript/gdscript_function.cpp:1089)
[13] GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) (/mnt/Miecz/godot3.2/modules/gdscript/gdscript.cpp:1208)
[14] Object::call(StringName const&, Variant const**, int, Variant::CallError&) (/mnt/Miecz/godot3.2/core/object.cpp:898 (discriminator 1))
[15] Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) (/mnt/Miecz/godot3.2/core/variant_call.cpp:1149 (discriminator 1))
[16] GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) (/mnt/Miecz/godot3.2/modules/gdscript/gdscript_function.cpp:1089)
[17] GDScriptInstance::_ml_call_reversed(GDScript*, StringName const&, Variant const**, int) (/mnt/Miecz/godot3.2/modules/gdscript/gdscript.cpp:1239)
[18] GDScriptInstance::call_multilevel_reversed(StringName const&, Variant const**, int) (/mnt/Miecz/godot3.2/modules/gdscript/gdscript.cpp:1248)
[19] Node::_notification(int) (/mnt/Miecz/godot3.2/scene/main/node.cpp:152)
[20] Node::_notificationv(int, bool) (/mnt/Miecz/godot3.2/./scene/main/node.h:46 (discriminator 14))
[21] Object::notification(int, bool) (/mnt/Miecz/godot3.2/core/object.cpp:931)
[22] Node::_propagate_ready() (/mnt/Miecz/godot3.2/scene/main/node.cpp:197)
[23] Node::_set_tree(SceneTree*) (/mnt/Miecz/godot3.2/scene/main/node.cpp:2626)
[24] Node::_add_child_nocheck(Node*, StringName const&) (/mnt/Miecz/godot3.2/scene/main/node.cpp:1154)
[25] Node::add_child(Node*, bool) (/mnt/Miecz/godot3.2/scene/main/node.cpp:1169)
[26] MethodBind2<Node*, bool>::call(Object*, Variant const**, int, Variant::CallError&) (/mnt/Miecz/godot3.2/./core/method_bind.gen.inc:1523 (discriminator 19))
[27] Object::call(StringName const&, Variant const**, int, Variant::CallError&) (/mnt/Miecz/godot3.2/core/object.cpp:919 (discriminator 1))
[28] Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) (/mnt/Miecz/godot3.2/core/variant_call.cpp:1149 (discriminator 1))
[29] GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) (/mnt/Miecz/godot3.2/modules/gdscript/gdscript_function.cpp:1089)
[30] GDScriptInstance::_ml_call_reversed(GDScript*, StringName const&, Variant const**, int) (/mnt/Miecz/godot3.2/modules/gdscript/gdscript.cpp:1239)
[31] GDScriptInstance::call_multilevel_reversed(StringName const&, Variant const**, int) (/mnt/Miecz/godot3.2/modules/gdscript/gdscript.cpp:1248)
[32] Node::_notification(int) (/mnt/Miecz/godot3.2/scene/main/node.cpp:152)
[33] Node::_notificationv(int, bool) (/mnt/Miecz/godot3.2/./scene/main/node.h:46 (discriminator 14))
[34] CanvasItem::_notificationv(int, bool) (/mnt/Miecz/godot3.2/./scene/2d/canvas_item.h:166 (discriminator 3))
[35] Control::_notificationv(int, bool) (/mnt/Miecz/godot3.2/./scene/gui/control.h:48 (discriminator 3))
[36] Object::notification(int, bool) (/mnt/Miecz/godot3.2/core/object.cpp:931)
[37] Node::_propagate_ready() (/mnt/Miecz/godot3.2/scene/main/node.cpp:197)
[38] Node::_propagate_ready() (/mnt/Miecz/godot3.2/scene/main/node.cpp:186 (discriminator 2))
[39] Node::_set_tree(SceneTree*) (/mnt/Miecz/godot3.2/scene/main/node.cpp:2626)
[40] SceneTree::init() (/mnt/Miecz/godot3.2/scene/main/scene_tree.cpp:466)
[41] OS_X11::run() (/mnt/Miecz/godot3.2/platform/x11/os_x11.cpp:3635)
[42] /mnt/Miecz/godot3.2/bin/godot.x11.tools.64s(main+0x326) [0x1870f7c] (/mnt/Miecz/godot3.2/platform/x11/godot_x11.cpp:57)
[43] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf3) [0x7f0a3c00c0b3] (??:0)
[44] /mnt/Miecz/godot3.2/bin/godot.x11.tools.64s(_start+0x2e) [0x1870b9e] (??:?)
VoxelGeneratorGraph.can_connect
Parameters [100, 100, 100, 100]
ERROR: get_node: FATAL: Condition "it == _nodes.end()" is true.
   At: modules/voxel/generators/graph/program_graph.cpp:151.
handle_crash: Program crashed with signal 4
Dumping the backtrace. Please include this when reporting the bug on https://github.com/godotengine/godot/issues
[1] /mnt/Miecz/godot3.2/bin/godot.x11.tools.64s() [0x187a2f0] (/mnt/Miecz/godot3.2/platform/x11/crash_handler_x11.cpp:54)
[2] /lib/x86_64-linux-gnu/libc.so.6(+0x46210) [0x7f9f0e0ce210] (??:0)
[3] ProgramGraph::get_node(unsigned int) const (/mnt/Miecz/godot3.2/modules/voxel/generators/graph/program_graph.cpp:151 (discriminator 1))
[4] ProgramGraph::is_connected(ProgramGraph::PortLocation, ProgramGraph::PortLocation) const (/mnt/Miecz/godot3.2/modules/voxel/generators/graph/program_graph.cpp:100)
[5] ProgramGraph::can_connect(ProgramGraph::PortLocation, ProgramGraph::PortLocation) const (/mnt/Miecz/godot3.2/modules/voxel/generators/graph/program_graph.cpp:112)
[6] VoxelGeneratorGraph::can_connect(unsigned int, unsigned int, unsigned int, unsigned int) const (/mnt/Miecz/godot3.2/modules/voxel/generators/graph/voxel_generator_graph.cpp:66)
[7] MethodBind4RC<bool, unsigned int, unsigned int, unsigned int, unsigned int>::call(Object*, Variant const**, int, Variant::CallError&) (/mnt/Miecz/godot3.2/./core/method_bind.gen.inc:3745 (discriminator 20))
[8] Object::call(StringName const&, Variant const**, int, Variant::CallError&) (/mnt/Miecz/godot3.2/core/object.cpp:919 (discriminator 1))
[9] Object::callv(StringName const&, Array const&) (/mnt/Miecz/godot3.2/core/object.cpp:826 (discriminator 1))
[10] MethodBind2R<Variant, StringName const&, Array const&>::call(Object*, Variant const**, int, Variant::CallError&) (/mnt/Miecz/godot3.2/./core/method_bind.gen.inc:1717 (discriminator 12))
[11] Object::call(StringName const&, Variant const**, int, Variant::CallError&) (/mnt/Miecz/godot3.2/core/object.cpp:919 (discriminator 1))
[12] Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) (/mnt/Miecz/godot3.2/core/variant_call.cpp:1149 (discriminator 1))
[13] GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) (/mnt/Miecz/godot3.2/modules/gdscript/gdscript_function.cpp:1089)
[14] GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) (/mnt/Miecz/godot3.2/modules/gdscript/gdscript.cpp:1208)
[15] Object::call(StringName const&, Variant const**, int, Variant::CallError&) (/mnt/Miecz/godot3.2/core/object.cpp:898 (discriminator 1))
[16] Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) (/mnt/Miecz/godot3.2/core/variant_call.cpp:1149 (discriminator 1))
[17] GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) (/mnt/Miecz/godot3.2/modules/gdscript/gdscript_function.cpp:1089)
[18] GDScriptInstance::_ml_call_reversed(GDScript*, StringName const&, Variant const**, int) (/mnt/Miecz/godot3.2/modules/gdscript/gdscript.cpp:1239)
[19] GDScriptInstance::call_multilevel_reversed(StringName const&, Variant const**, int) (/mnt/Miecz/godot3.2/modules/gdscript/gdscript.cpp:1248)
[20] Node::_notification(int) (/mnt/Miecz/godot3.2/scene/main/node.cpp:152)
[21] Node::_notificationv(int, bool) (/mnt/Miecz/godot3.2/./scene/main/node.h:46 (discriminator 14))
[22] Object::notification(int, bool) (/mnt/Miecz/godot3.2/core/object.cpp:931)
[23] Node::_propagate_ready() (/mnt/Miecz/godot3.2/scene/main/node.cpp:197)
[24] Node::_propagate_ready() (/mnt/Miecz/godot3.2/scene/main/node.cpp:186 (discriminator 2))
[25] Node::_set_tree(SceneTree*) (/mnt/Miecz/godot3.2/scene/main/node.cpp:2626)
[26] SceneTree::init() (/mnt/Miecz/godot3.2/scene/main/scene_tree.cpp:466)
[27] OS_X11::run() (/mnt/Miecz/godot3.2/platform/x11/os_x11.cpp:3635)
[28] /mnt/Miecz/godot3.2/bin/godot.x11.tools.64s(main+0x326) [0x1870f7c] (/mnt/Miecz/godot3.2/platform/x11/godot_x11.cpp:57)
[29] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf3) [0x7f9f0e0af0b3] (??:0)
[30] /mnt/Miecz/godot3.2/bin/godot.x11.tools.64s(_start+0x2e) [0x1870b9e] (??:?)
VoxelGeneratorGraph.get_node_type_info
Parameters [100]
ERROR: operator[]: FATAL: Condition "i >= N" is true.
   At: modules/voxel/generators/graph/../../streams/../storage/../util/fixed_array.h:32.
handle_crash: Program crashed with signal 4
Dumping the backtrace. Please include this when reporting the bug on https://github.com/godotengine/godot/issues
[1] /mnt/Miecz/godot3.2/bin/godot.x11.tools.64s() [0x187a2f0] (/mnt/Miecz/godot3.2/platform/x11/crash_handler_x11.cpp:54)
[2] /lib/x86_64-linux-gnu/libc.so.6(+0x46210) [0x7f846da05210] (??:0)
[3] FixedArray<VoxelGraphNodeDB::NodeType, 42u>::operator[](unsigned int) const (/mnt/Miecz/godot3.2/modules/voxel/generators/graph/../../streams/../storage/../util/fixed_array.h:32 (discriminator 1))
[4] VoxelGraphNodeDB::get_type_info_dict(unsigned int) const (/mnt/Miecz/godot3.2/modules/voxel/generators/graph/voxel_graph_node_db.cpp:1608)
[5] VoxelGeneratorGraph::_b_get_node_type_info(int) const (/mnt/Miecz/godot3.2/modules/voxel/generators/graph/voxel_generator_graph.cpp:987)
[6] MethodBind1RC<Dictionary, int>::call(Object*, Variant const**, int, Variant::CallError&) (/mnt/Miecz/godot3.2/./core/method_bind.gen.inc:1333 (discriminator 9))
[7] Object::call(StringName const&, Variant const**, int, Variant::CallError&) (/mnt/Miecz/godot3.2/core/object.cpp:919 (discriminator 1))
[8] Object::callv(StringName const&, Array const&) (/mnt/Miecz/godot3.2/core/object.cpp:826 (discriminator 1))
[9] MethodBind2R<Variant, StringName const&, Array const&>::call(Object*, Variant const**, int, Variant::CallError&) (/mnt/Miecz/godot3.2/./core/method_bind.gen.inc:1717 (discriminator 12))
[10] Object::call(StringName const&, Variant const**, int, Variant::CallError&) (/mnt/Miecz/godot3.2/core/object.cpp:919 (discriminator 1))
[11] Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) (/mnt/Miecz/godot3.2/core/variant_call.cpp:1149 (discriminator 1))
[12] GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) (/mnt/Miecz/godot3.2/modules/gdscript/gdscript_function.cpp:1089)
[13] GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) (/mnt/Miecz/godot3.2/modules/gdscript/gdscript.cpp:1208)
[14] Object::call(StringName const&, Variant const**, int, Variant::CallError&) (/mnt/Miecz/godot3.2/core/object.cpp:898 (discriminator 1))
[15] Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) (/mnt/Miecz/godot3.2/core/variant_call.cpp:1149 (discriminator 1))
[16] GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) (/mnt/Miecz/godot3.2/modules/gdscript/gdscript_function.cpp:1089)
[17] GDScriptInstance::_ml_call_reversed(GDScript*, StringName const&, Variant const**, int) (/mnt/Miecz/godot3.2/modules/gdscript/gdscript.cpp:1239)
[18] GDScriptInstance::call_multilevel_reversed(StringName const&, Variant const**, int) (/mnt/Miecz/godot3.2/modules/gdscript/gdscript.cpp:1248)
[19] Node::_notification(int) (/mnt/Miecz/godot3.2/scene/main/node.cpp:152)
[20] Node::_notificationv(int, bool) (/mnt/Miecz/godot3.2/./scene/main/node.h:46 (discriminator 14))
[21] Object::notification(int, bool) (/mnt/Miecz/godot3.2/core/object.cpp:931)
[22] Node::_propagate_ready() (/mnt/Miecz/godot3.2/scene/main/node.cpp:197)
[23] Node::_propagate_ready() (/mnt/Miecz/godot3.2/scene/main/node.cpp:186 (discriminator 2))
[24] Node::_set_tree(SceneTree*) (/mnt/Miecz/godot3.2/scene/main/node.cpp:2626)
[25] SceneTree::init() (/mnt/Miecz/godot3.2/scene/main/scene_tree.cpp:466)
[26] OS_X11::run() (/mnt/Miecz/godot3.2/platform/x11/os_x11.cpp:3635)
[27] /mnt/Miecz/godot3.2/bin/godot.x11.tools.64s(main+0x326) [0x1870f7c] (/mnt/Miecz/godot3.2/platform/x11/godot_x11.cpp:57)
[28] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf3) [0x7f846d9e60b3] (??:0)
[29] /mnt/Miecz/godot3.2/bin/godot.x11.tools.64s(_start+0x2e) [0x1870b9e] (??:?)
Zylann commented 3 years ago

vector3i.h:222:42: runtime error: left shift of negative value -5

Why is this a runtime error? I used << and >> for a long time as a fast way to do floored division and multiplication by a power of two, it always worked so far (https://ideone.com/sPRvtB). Is this not standard or actually UB? Or do you mean the shift was a negative shift? (i.e x << -5 ?) If so, how did that happen? I'll add asserts just in case.

[3] ProgramGraph::get_node(unsigned int) const (/mnt/Miecz/godot3.2/modules/voxel/generators/graph/program_graph.cpp:151 (discriminator 1))
[4] ProgramGraph::remove_node(unsigned int) (/mnt/Miecz/godot3.2/modules/voxel/generators/graph/program_graph.cpp:58)
[5] VoxelGeneratorGraph::remove_node(unsigned int) (/mnt/Miecz/godot3.2/modules/voxel/generators/graph/voxel_generator_graph.cpp:58)
[6] MethodBind1<unsigned int>::call(Object*, Variant const**, int, Variant::CallError&) (/mnt/Miecz/godot3.2/./core/method_bind.gen.inc:775 (discriminator 12))

This looks like a call to remove_node from GDScript. I think I should use an ERR_FAIL_COND for the exposed API, the CRASH_COND should only get reached if a problem is in a lower-level layer, or maybe have a chain of ERR_FAIL_COND all the way.

[3] ProgramGraph::get_node(unsigned int) const (/mnt/Miecz/godot3.2/modules/voxel/generators/graph/program_graph.cpp:151 (discriminator 1))
[4] ProgramGraph::is_connected(ProgramGraph::PortLocation, ProgramGraph::PortLocation) const (/mnt/Miecz/godot3.2/modules/voxel/generators/graph/program_graph.cpp:100)
[5] ProgramGraph::can_connect(ProgramGraph::PortLocation, ProgramGraph::PortLocation) const (/mnt/Miecz/godot3.2/modules/voxel/generators/graph/program_graph.cpp:112)
[6] VoxelGeneratorGraph::can_connect(unsigned int, unsigned int, unsigned int, unsigned int) const (/mnt/Miecz/godot3.2/modules/voxel/generators/graph/voxel_generator_graph.cpp:66)
[7] MethodBind4RC<bool, unsigned int, unsigned int, unsigned int, unsigned int>::call(Object*, Variant const**, int, Variant::CallError&) (/mnt/Miecz/godot3.2/./core/method_bind.gen.inc:3745 (discriminator 20))

Same here

[3] FixedArray<VoxelGraphNodeDB::NodeType, 42u>::operator[](unsigned int) const (/mnt/Miecz/godot3.2/modules/voxel/generators/graph/../../streams/../storage/../util/fixed_array.h:32 (discriminator 1))
[4] VoxelGraphNodeDB::get_type_info_dict(unsigned int) const (/mnt/Miecz/godot3.2/modules/voxel/generators/graph/voxel_graph_node_db.cpp:1608)
[5] VoxelGeneratorGraph::_b_get_node_type_info(int) const (/mnt/Miecz/godot3.2/modules/voxel/generators/graph/voxel_generator_graph.cpp:987)
[6] MethodBind1RC<Dictionary, int>::call(Object*, Variant const**, int, Variant::CallError&) (/mnt/Miecz/godot3.2/./core/method_bind.gen.inc:1333 (discriminator 9))

Same here with get_type_info_dict