google / flatbuffers

FlatBuffers: Memory Efficient Serialization Library
https://flatbuffers.dev/
Apache License 2.0
22.52k stars 3.19k forks source link

[TS] flatc silently crashing (segmentation fault) #8299

Open Clonkex opened 1 month ago

Clonkex commented 1 month ago

Minimal replication schema:

namespace SomeNamespace;

enum Colour : byte { Red, Green }

struct SubStruct {
    colour: Colour;
}

struct BaseStruct {
    test: SubStruct;
}

When running flatc.exe --ts test.fbs, the command takes a little longer to run than normal and fails to complete. There are no outputs in the console, but the files are not completely generated, and echo %ERRORLEVEL% returns -1073741819. I'm not sure what I'm doing wrong. It seems to be related to the enum in the sub-struct.

OS: Windows 11 Version 10.0.22621 Build 22621 flatc version: 24.3.25

Clonkex commented 1 month ago

Compiling from source and running the same test under Ubuntu 22.04 LTS gives a segfault. I have no clue what I'm doing with gdb but this is what I get with a backtrace:

(gdb) backtrace
#0  0x00005555555ab30e in std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::size() const ()
#1  0x000055555570bc95 in flatbuffers::(anonymous namespace)::ImportDefinition flatbuffers::ts::TsGenerator::AddImport<flatbuffers::EnumDef>(std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, flatbuffers::(anonymous namespace)::ImportDefinition, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, flatbuffers::(anonymous namespace)::ImportDefinition> > >&, flatbuffers::Definition const&, flatbuffers::EnumDef const&) ()
#2  0x00005555557142fd in flatbuffers::ts::TsGenerator::GenTypeName(std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, flatbuffers::(anonymous namespace)::ImportDefinition, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, flatbuffers::(anonymous namespace)::ImportDefinition> > >&, flatbuffers::Definition const&, flatbuffers::Type const&, bool, bool) ()
#3  0x0000555555714a7b in flatbuffers::ts::TsGenerator::GenStructArgs(std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, flatbuffers::(anonymous namespace)::ImportDefinition, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, flatbuffers::(anonymous namespace)::ImportDefinition> > >&, flatbuffers::StructDef const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ()
#4  0x0000555555714a12 in flatbuffers::ts::TsGenerator::GenStructArgs(std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, flatbuffers::(anonymous namespace)::ImportDefinition, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, flatbuffers::(anonymous namespace)::ImportDefinition> > >&, flatbuffers::StructDef const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ()
#5  0x000055555572422e in flatbuffers::ts::TsGenerator::GenStruct(flatbuffers::Parser const&, flatbuffers::StructDef&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, flatbuffers::(anonymous namespace)::ImportDefinition, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, flatbuffers::(anonymous namespace)::ImportDefinition> > >&) ()
#6  0x0000555555710ba7 in flatbuffers::ts::TsGenerator::generateStructs() ()
#7  0x000055555570fff2 in flatbuffers::ts::TsGenerator::generate() ()
#8  0x000055555570ad70 in flatbuffers::GenerateTS(flatbuffers::Parser const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ()
#9  0x000055555570b0dd in flatbuffers::(anonymous namespace)::TsCodeGenerator::GenerateCode(flatbuffers::Parser const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ()
#10 0x00005555557d5c97 in flatbuffers::FlatCompiler::GenerateCode(flatbuffers::FlatCOptions const&, flatbuffers::Parser&) ()
#11 0x00005555557d6b2c in flatbuffers::FlatCompiler::Compile(flatbuffers::FlatCOptions const&) ()
#12 0x00005555557e9ead in main ()

I don't have time to investigate this myself but I hope it can be fixed quickly anyway 😊