DARMA-tasking / vt

DARMA/vt => Virtual Transport
Other
35 stars 9 forks source link

including `app_config.h` crashes applications #1702

Open cz4rs opened 2 years ago

cz4rs commented 2 years ago

Describe the bug When creating custom AppConfig, including vt/configs/arguments/app_config.h (before other vt includes) causes tests and examples to crash.

To Reproduce These changes will crash (std::bad_alloc thrown):

--- a/examples/hello_world/hello_world.cc
+++ b/examples/hello_world/hello_world.cc
@@ -41,6 +41,7 @@
 */

+#include <vt/configs/arguments/app_config.h>
 #include <vt/transport.h>

 struct HelloMsg : vt::Message {
@@ -55,6 +56,7 @@ static void hello_world(HelloMsg* msg) {

 int main(int argc, char** argv) {
+  vt::arguments::AppConfig some_config;
   vt::initialize(argc, argv);
 mpiexec -n 2 ./build/examples/hello_world/hello_world 
terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc

===================================================================================
=   BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
(...)
GDB backtrace ``` terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc Program received signal SIGABRT, Aborted. __pthread_kill_implementation (threadid=, signo=signo@entry=6, no_tid=no_tid@entry=0) at pthread_kill.c:44 44 return INTERNAL_SYSCALL_ERROR_P (ret) ? INTERNAL_SYSCALL_ERRNO (ret) : 0; (gdb) bt #0 __pthread_kill_implementation (threadid=, signo=signo@entry=6, no_tid=no_tid@entry=0) at pthread_kill.c:44 #1 0x00007ffff6fbe8f3 in __pthread_kill_internal (signo=6, threadid=) at pthread_kill.c:78 #2 0x00007ffff6f716a6 in __GI_raise (sig=sig@entry=6) at ../sysdeps/posix/raise.c:26 #3 0x00007ffff6f5b7d3 in __GI_abort () at abort.c:79 #4 0x00007ffff71f7a06 in __gnu_cxx::__verbose_terminate_handler () at ../../../../libstdc++-v3/libsupc++/vterminate.cc:95 #5 0x00007ffff72030bc in __cxxabiv1::__terminate (handler=) at ../../../../libstdc++-v3/libsupc++/eh_terminate.cc:48 #6 0x00007ffff7203127 in std::terminate () at ../../../../libstdc++-v3/libsupc++/eh_terminate.cc:58 #7 0x00007ffff72033c9 in __cxxabiv1::__cxa_throw (obj=, tinfo=0x7ffff7365d98 , dest=0x7ffff7201780 ) at ../../../../libstdc++-v3/libsupc++/eh_throw.cc:95 #8 0x00007ffff71f7611 in operator new (sz=) at ../../../../libstdc++-v3/libsupc++/new_op.cc:54 #9 0x000000000254881c in std::__cxx11::basic_string, std::allocator >::_M_construct (this=0x7fffffffb478, __beg=0x69666e6f635f7476 , __end=0x69666ed8d1c8a2dd ) at /usr/bin/../lib/gcc/x86_64-redhat-linux/11/../../../../include/c++/11/bits/basic_string.tcc:219 #10 0x0000000001df96a3 in vt::CLI::App::add_option, std::allocator >, std::__cxx11::basic_string, std::allocator >, (vt::CLI::detail::enabler)0>(std::__cxx11::basic_string, std::allocator >, std::__cxx11::basic_string, std::allocator >&, std::__cxx11::basic_string, std::allocator >, bool)::{lambda()#1}::operator()[abi:cxx11]() const ( this=0x2bdd378) at /home/cz4rs/code/vt/lib/CLI/CLI/CLI11.hpp:5157 #11 0x0000000001df9650 in std::__invoke_impl, std::allocator >, vt::CLI::App::add_option, std::allocator >, std::__cxx11::basic_string, std::allocator >, (vt::CLI::detail::enabler)0>(std::__cxx11::basic_string, std::allocator >, std::__cxx11::basic_string, std::allocator >&, std::__cxx11::basic_string, std::allocator >, bool)::{lambda()#1}&>(std::__invoke_other, vt::CLI::App::add_option, std::allocator >, std::__cxx11::basic_string, std::allocator >, (vt::CLI::detail::enabler)0>(std::__cxx11::basic_string, std::allocator >, std::__cxx11::basic_string, std::allocator >&, std::__cxx11::basic_string, std::allocator >, bool)::{lambda()#1}&) (__f=...) at /usr/bin/../lib/gcc/x86_64-redhat-linux/11/../../../../include/c++/11/bits/invoke.h:61 #12 0x0000000001df95e0 in std::__invoke_r, std::allocator >, vt::CLI::App::add_option, std::allocator >, std::__cxx11::basic_string, std::allocator >, (vt::CLI::detail::enabler)0>(std::__cxx11::basic_string, std::allocator >, std::__cxx11::basic_string, std::allocator >&, std::__cxx11::basic_string, std::allocator >, bool)::{lambda()#1}&>(vt::CLI::App::add_option, std::allocator >, std::__cxx11::basic_string, std::allocator >, (vt::CLI::detail::enabler)0>(std::__cxx11::basic_string, std::allocator >, std::__cxx11::basic_string, std::allocator >&, std::__cxx11::basic_string, std::allocator >, bool)::{lambda()#1}&) ( __fn=...) at /usr/bin/../lib/gcc/x86_64-redhat-linux/11/../../../../include/c++/11/bits/invoke.h:142 #13 0x0000000001df94d0 in std::_Function_handler, std::allocator > (), vt::CLI::App::add_option, std::allocator >, std::__cxx11::basic_string, std::allocator >, (vt::CLI::detail::enabler)0>(std::__cxx11::basic_string, std::allocator >, std::__cxx11::basic_string, std::allocator >&, std::__cxx11::basic_string, std::allocator >, bool)::{lambda()#1}>::_M_invoke(std::_Any_data const&) (__functor=...) at /usr/bin/../lib/gcc/x86_64-redhat-linux/11/../../../../include/c++/11/bits/std_function.h:290 #14 0x0000000001df6198 in std::function, std::allocator > ()>::operator()() const (this=0x2bdd378) at /usr/bin/../lib/gcc/x86_64-redhat-linux/11/../../../../include/c++/11/bits/std_function.h:590 #15 0x0000000001df2741 in vt::CLI::Option::capture_default_str (this=0x2bdd250) at /home/cz4rs/code/vt/lib/CLI/CLI/CLI11.hpp:4376 #16 0x0000000001def3a7 in vt::CLI::App::add_option(std::__cxx11::basic_string, std::allocator >, std::function, std::allocator >, std::allocator, std::allocator > > > const&)>, std::__cxx11::basic_string, std::allocator >, bool, std::function, std::allocator > ()>) ( this=0x7fffffffbd88, option_name="--vt_output_config_file", option_callback=..., option_description="Name of configuration file to output", defaulted=true, func=...) at /home/cz4rs/code/vt/lib/CLI/CLI/CLI11.hpp:5121 #17 0x0000000001df882f in vt::CLI::App::add_option, std::allocator >, std::__cxx11::basic_string, std::allocator >, (vt::CLI::detail::enabler)0> (this=0x7fffffffbd88, option_name=..., variable=, option_description="Name of configuration file to output", defaulted=true) at /home/cz4rs/code/vt/lib/CLI/CLI/CLI11.hpp:5156 #18 0x0000000001dce396 in vt::arguments::(anonymous namespace)::addConfigFileArgs (app=..., appConfig=...) at /home/cz4rs/code/vt/src/vt/configs/arguments/args.cc:628 #19 0x0000000001dbc04b in vt::arguments::ArgConfig::parseToConfig[abi:cxx11](int&, char**&, vt::arguments::AppConfig&) (this=0x2b8ab80, argc=@0x7fffffffce68: 1, argv=@0x7fffffffce60: 0x7fffffffcfa8, appConfig=...) at /home/cz4rs/code/vt/src/vt/configs/arguments/args.cc:754 #20 0x0000000001dbbbc8 in vt::arguments::ArgConfig::parse[abi:cxx11](int&, char**&, vt::arguments::AppConfig const*) (this=0x2b8ab80, argc=@0x7fffffffce68: 1, argv=@0x7fffffffce60: 0x7fffffffcfa8, appConfig=0x0) at /home/cz4rs/code/vt/src/vt/configs/arguments/args.cc:716 #21 0x000000000159e889 in vt::runtime::Runtime::Runtime (this=0x2b6f1e0, argc=@0x7fffffffce68: 1, argv=@0x7fffffffce60: 0x7fffffffcfa8, in_num_workers=-1, interop_mode=false, in_comm=1140850688, in_instance=vt::runtime::DefaultInstance, appConfig=0x0) at /home/cz4rs/code/vt/src/vt/runtime/runtime.cc:156 #22 0x0000000001598650 in std::make_unique ( __args=@0x7fffffffc920: 0x0, __args=@0x7fffffffc920: 0x0, __args=@0x7fffffffc920: 0x0, __args=@0x7fffffffc920: 0x0, __args=@0x7fffffffc920: 0x0, __args=@0x7fffffffc920: 0x0, __args=@0x7fffffffc920: 0x0) at /usr/bin/../lib/gcc/x86_64-redhat-linux/11/../../../../include/c++/11/bits/unique_ptr.h:962 #23 0x00000000015984b4 in vt::CollectiveAnyOps<(vt::runtime::eRuntimeInstance)0>::initialize (argc=@0x7fffffffce68: 1, argv=@0x7fffffffce60: 0x7fffffffcfa8, num_workers=-1, is_interop=false, comm=0x0, appConfig=0x0) at /home/cz4rs/code/vt/src/vt/collective/collective_ops.cc:225 #24 0x000000000159e03d in vt::initialize (argc=@0x7fffffffce68: 1, argv=@0x7fffffffce60: 0x7fffffffcfa8, comm=0x0, appConfig=0x0) at /home/cz4rs/code/vt/src/vt/collective/startup.cc:66 #25 0x0000000001555f61 in main (argc=1, argv=0x7fffffffcfa8) at /home/cz4rs/code/vt/examples/hello_world/hello_world.cc:60 (gdb) ```

If the header is included after vt/transport.h, the example runs just fine:

--- a/examples/hello_world/hello_world.cc
+++ b/examples/hello_world/hello_world.cc
@@ -42,6 +42,7 @@
 */

 #include <vt/transport.h>
+#include <vt/configs/arguments/app_config.h>

 struct HelloMsg : vt::Message {
@@ -55,6 +56,7 @@ static void hello_world(HelloMsg* msg) {

 int main(int argc, char** argv) {
+  vt::arguments::AppConfig some_config;
   vt::initialize(argc, argv);
 mpiexec -n 2 ./build/examples/hello_world/hello_world 
vt: Version: 1.1.0
vt: Runtime Initializing: mode: single-thread per rank
(...)
0: Hello from node 0
1: Hello from node 0
vt: Total collective epochs processed: 0
vt: Total work units processed: 18
vt: Runtime Finalizing

Additional context

cz4rs commented 2 years ago

ASan output:

vt  ./build/examples/hello_world/hello_world 
=================================================================
==40784==ERROR: AddressSanitizer: allocator is out of memory trying to allocate 0x696e692e68 bytes
    #0 0x1661377 in operator new(unsigned long) (/home/cz4rs/code/vt/build/examples/hello_world/hello_world+0x1661377)
    #1 0x3ae6d7b in void std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_construct<char*>(char*, char*, std::forward_iterator_tag) /usr/bin/../lib/gcc/x86_64-redhat-linux/11/../../../../include/c++/11/bits/basic_string.tcc:219:14
    #2 0x2a4d9a4 in vt::CLI::Option* vt::CLI::App::add_option<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, (vt::CLI::detail::enabler)0>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool)::'lambda'()::operator()[abi:cxx11]() const /home/cz4rs/code/vt/lib/CLI/CLI/CLI11.hpp:5157:20
    #3 0x2a4d92f in std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > std::__invoke_impl<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, vt::CLI::Option* vt::CLI::App::add_option<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, (vt::CLI::detail::enabler)0>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool)::'lambda'()&>(std::__invoke_other, vt::CLI::Option* vt::CLI::App::add_option<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, (vt::CLI::detail::enabler)0>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool)::'lambda'()&) /usr/bin/../lib/gcc/x86_64-redhat-linux/11/../../../../include/c++/11/bits/invoke.h:61:14
    #4 0x2a4d8bf in std::enable_if<__and_<std::__not_<std::is_void<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::is_convertible<std::__invoke_result<vt::CLI::Option* vt::CLI::App::add_option<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, (vt::CLI::detail::enabler)0>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool)::'lambda'()&>::type, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::value, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::type std::__invoke_r<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, vt::CLI::Option* vt::CLI::App::add_option<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, (vt::CLI::detail::enabler)0>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool)::'lambda'()&>(vt::CLI::Option* vt::CLI::App::add_option<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, (vt::CLI::detail::enabler)0>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool)::'lambda'()&) /usr/bin/../lib/gcc/x86_64-redhat-linux/11/../../../../include/c++/11/bits/invoke.h:142:14
    #5 0x2a4d75f in std::_Function_handler<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > (), vt::CLI::Option* vt::CLI::App::add_option<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, (vt::CLI::detail::enabler)0>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool)::'lambda'()>::_M_invoke(std::_Any_data const&) /usr/bin/../lib/gcc/x86_64-redhat-linux/11/../../../../include/c++/11/bits/std_function.h:290:9
    #6 0x2a46db5 in std::function<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > ()>::operator()() const /usr/bin/../lib/gcc/x86_64-redhat-linux/11/../../../../include/c++/11/bits/std_function.h:590:9
    #7 0x2a3e6d3 in vt::CLI::Option::capture_default_str() /home/cz4rs/code/vt/lib/CLI/CLI/CLI11.hpp:4376:28
    #8 0x2a33b0a in vt::CLI::App::add_option(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<bool (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> > > > const&)>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool, std::function<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > ()>) /home/cz4rs/code/vt/lib/CLI/CLI/CLI11.hpp:5121:25
    #9 0x2a4bdf4 in vt::CLI::Option* vt::CLI::App::add_option<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, (vt::CLI::detail::enabler)0>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool) /home/cz4rs/code/vt/lib/CLI/CLI/CLI11.hpp:5156:23
    #10 0x29d5954 in vt::arguments::(anonymous namespace)::addConfigFileArgs(vt::CLI::App&, vt::arguments::AppConfig&) /home/cz4rs/code/vt/src/vt/configs/arguments/args.cc:628:17
    #11 0x29b7fe0 in vt::arguments::ArgConfig::parseToConfig[abi:cxx11](int&, char**&, vt::arguments::AppConfig&) /home/cz4rs/code/vt/src/vt/configs/arguments/args.cc:754:3
    #12 0x29b7619 in vt::arguments::ArgConfig::parse[abi:cxx11](int&, char**&, vt::arguments::AppConfig const*) /home/cz4rs/code/vt/src/vt/configs/arguments/args.cc:716:12
    #13 0x170a172 in vt::runtime::Runtime::Runtime(int&, char**&, short, bool, int, vt::runtime::eRuntimeInstance, vt::arguments::AppConfig const*) /home/cz4rs/code/vt/src/vt/runtime/runtime.cc:156:18
    #14 0x16fa0cf in std::_MakeUniq<vt::runtime::Runtime>::__single_object std::make_unique<vt::runtime::Runtime, int&, char**&, short const&, bool&, int&, vt::runtime::eRuntimeInstance, vt::arguments::AppConfig const*&>(int&, char**&, short const&, bool&, int&, vt::runtime::eRuntimeInstance&&, vt::arguments::AppConfig const*&) /usr/bin/../lib/gcc/x86_64-redhat-linux/11/../../../../include/c++/11/bits/unique_ptr.h:962:34
    #15 0x16f9c4f in vt::CollectiveAnyOps<(vt::runtime::eRuntimeInstance)0>::initialize(int&, char**&, short, bool, int*, vt::arguments::AppConfig const*) /home/cz4rs/code/vt/src/vt/collective/collective_ops.cc:225:31
    #16 0x170828c in vt::initialize(int&, char**&, int*, vt::arguments::AppConfig const*) /home/cz4rs/code/vt/src/vt/collective/startup.cc:66:10
    #17 0x1664302 in main /home/cz4rs/code/vt/examples/hello_world/hello_world.cc:59:3
    #18 0x7f993d33555f in __libc_start_call_main (/lib64/libc.so.6+0x2d55f)

==40784==HINT: if you don't care about these errors you may set allocator_may_return_null=1
SUMMARY: AddressSanitizer: out-of-memory (/home/cz4rs/code/vt/build/examples/hello_world/hello_world+0x1661377) in operator new(unsigned long)
==40784==ABORTING