Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

net: Add missing locking annotation for vNodes. vNodes is guarded by cs_vNodes. #15201

Merged
merged 1 commit into from Feb 8, 2019

Conversation

Projects
None yet
5 participants
@practicalswift
Copy link
Member

commented Jan 18, 2019

Add locking annotation for vNodes. vNodes is guarded by cs_vNodes.

@practicalswift practicalswift changed the title net: Add missing cs_vNodes lock in CConnman::Stop(). Add missing locking annotation. net: Add missing cs_vNodes lock in CConnman::Stop(). Add missing locking annotation. [wip] Jan 18, 2019

@practicalswift practicalswift force-pushed the practicalswift:cs_vNodes branch 2 times, most recently Jan 18, 2019

@fanquake fanquake added the P2P label Jan 18, 2019

@DrahtBot

This comment has been minimized.

Copy link
Contributor

commented Jan 19, 2019

The following sections might be updated with supplementary metadata relevant to reviewers and maintainers.

Conflicts

No conflicts as of last run.

@practicalswift practicalswift force-pushed the practicalswift:cs_vNodes branch Jan 19, 2019

@practicalswift practicalswift changed the title net: Add missing cs_vNodes lock in CConnman::Stop(). Add missing locking annotation. [wip] net: Add missing locking annotation for vNodes. vNodes is guarded by cs_vNodes. Jan 19, 2019

Show resolved Hide resolved src/net.cpp Outdated

@practicalswift practicalswift force-pushed the practicalswift:cs_vNodes branch 3 times, most recently Jan 19, 2019

@practicalswift practicalswift force-pushed the practicalswift:cs_vNodes branch to eea02be Jan 19, 2019

@practicalswift

This comment has been minimized.

Copy link
Member Author

commented Feb 7, 2019

@laanwj Feedback addressed! Please re-review :-)

@laanwj

This comment has been minimized.

Copy link
Member

commented Feb 8, 2019

Thanks! I am still somewhat skeptical about adding a lock annotation then working around it, but all in all I think the annotation has value because it still allows checking the other uses of the lock. It's also good to document the hairy situation with a comment.

utACK eea02be

@MarcoFalke MarcoFalke merged commit eea02be into bitcoin:master Feb 8, 2019

2 checks passed

continuous-integration/appveyor/pr AppVeyor build succeeded
Details
continuous-integration/travis-ci/pr The Travis CI build passed
Details

MarcoFalke added a commit that referenced this pull request Feb 8, 2019

Merge #15201: net: Add missing locking annotation for vNodes. vNodes …
…is guarded by cs_vNodes.

eea02be Add locking annotation for vNodes. vNodes is guarded by cs_vNodes. (practicalswift)

Pull request description:

  Add locking annotation for `vNodes`. `vNodes` is guarded by `cs_vNodes`.

Tree-SHA512: b1e18be22ba5b9dd153536380321b09b30a75a20575f975af9af94164f51982b32267ba0994e77c801513b59da05d923a974a9d2dfebdac48024c4bda98b53af
@MarcoFalke

This comment has been minimized.

Copy link
Member

commented Apr 11, 2019

Adding the to-be-fixed data race for future reference:

Line numbers as of bb68abe

WARNING: ThreadSanitizer: data race (pid=28633)
  Write of size 8 at 0x7f94042f9328 by main thread (mutexes: write M132887):
    #0 std::vector<CNode*, std::allocator<CNode*> >::_M_erase_at_end(CNode**) /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/stl_vector.h:1439 (bitcoind+0x0000005216ff)
    #1 std::vector<CNode*, std::allocator<CNode*> >::clear() /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/stl_vector.h:1212 (bitcoind+0x0000005216ff)
    #2 CConnman::Stop() /home/travis/build/bitcoin/bitcoin/build/bitcoin-x86_64-unknown-linux-gnu/src/net.cpp:2351 (bitcoind+0x0000005216ff)
    #3 Shutdown(InitInterfaces&) /home/travis/build/bitcoin/bitcoin/build/bitcoin-x86_64-unknown-linux-gnu/src/init.cpp:223 (bitcoind+0x0000004c27e2)
    #4 AppInit(int, char**) /home/travis/build/bitcoin/bitcoin/build/bitcoin-x86_64-unknown-linux-gnu/src/bitcoind.cpp:185 (bitcoind+0x0000004bd41a)
    #5 main /home/travis/build/bitcoin/bitcoin/build/bitcoin-x86_64-unknown-linux-gnu/src/bitcoind.cpp:201 (bitcoind+0x0000004bd41a)
  Previous read of size 8 at 0x7f94042f9328 by thread T2 (mutexes: write M131465, write M131617):
    #0 __normal_iterator /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/stl_iterator.h:741 (bitcoind+0x00000051b128)
    #1 std::vector<CNode*, std::allocator<CNode*> >::end() /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/stl_vector.h:566 (bitcoind+0x00000051b128)
    #2 CConnman::GetExtraOutboundCount() /home/travis/build/bitcoin/bitcoin/build/bitcoin-x86_64-unknown-linux-gnu/src/net.cpp:1648 (bitcoind+0x00000051b128)
    #3 PeerLogicValidation::EvictExtraOutboundPeers(long) /home/travis/build/bitcoin/bitcoin/build/bitcoin-x86_64-unknown-linux-gnu/src/net_processing.cpp:3346 (bitcoind+0x00000055af44)
    #4 PeerLogicValidation::CheckForStaleTipAndEvictPeers(Consensus::Params const&) /home/travis/build/bitcoin/bitcoin/build/bitcoin-x86_64-unknown-linux-gnu/src/net_processing.cpp:3408 (bitcoind+0x00000053cb1c)
    #5 void std::_Mem_fn_base<void (PeerLogicValidation::*)(Consensus::Params const&), true>::operator()<Consensus::Params&, void>(PeerLogicValidation*, Consensus::Params&) const /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/functional:600 (bitcoind+0x00000058b607)
    #6 void std::_Bind<std::_Mem_fn<void (PeerLogicValidation::*)(Consensus::Params const&)> (PeerLogicValidation*, Consensus::Params)>::__call<void, , 0ul, 1ul>(std::tuple<>&&, std::_Index_tuple<0ul, 1ul>) /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/functional:1073 (bitcoind+0x00000058b607)
    #7 void std::_Bind<std::_Mem_fn<void (PeerLogicValidation::*)(Consensus::Params const&)> (PeerLogicValidation*, Consensus::Params)>::operator()<, void>() /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/functional:1131 (bitcoind+0x00000058b607)
    #8 std::_Function_handler<void (), std::_Bind<std::_Mem_fn<void (PeerLogicValidation::*)(Consensus::Params const&)> (PeerLogicValidation*, Consensus::Params)> >::_M_invoke(std::_Any_data const&) /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/functional:1871 (bitcoind+0x00000058b607)
    #9 std::function<void ()>::operator()() const /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/functional:2267 (bitcoind+0x0000008070ff)
    #10 Repeat(CScheduler*, std::function<void ()>, long) /home/travis/build/bitcoin/bitcoin/build/bitcoin-x86_64-unknown-linux-gnu/src/scheduler.cpp:121 (bitcoind+0x0000008070ff)
    #11 void std::_Bind<void (*(CScheduler*, std::function<void ()>, long))(CScheduler*, std::function<void ()>, long)>::__call<void, , 0ul, 1ul, 2ul>(std::tuple<>&&, std::_Index_tuple<0ul, 1ul, 2ul>) /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/functional:1073 (bitcoind+0x000000808406)
    #12 void std::_Bind<void (*(CScheduler*, std::function<void ()>, long))(CScheduler*, std::function<void ()>, long)>::operator()<, void>() /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/functional:1131 (bitcoind+0x000000808196)
    #13 std::_Function_handler<void (), std::_Bind<void (*(CScheduler*, std::function<void ()>, long))(CScheduler*, std::function<void ()>, long)> >::_M_invoke(std::_Any_data const&) /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/functional:1871 (bitcoind+0x000000808196)
    #14 std::function<void ()>::operator()() const /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/functional:2267 (bitcoind+0x0000008066c5)
    #15 CScheduler::serviceQueue() /home/travis/build/bitcoin/bitcoin/build/bitcoin-x86_64-unknown-linux-gnu/src/scheduler.cpp:82 (bitcoind+0x0000008066c5)
    #16 void std::_Mem_fn_base<void (CScheduler::*)(), true>::operator()<, void>(CScheduler*) const /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/functional:600 (bitcoind+0x000000500e77)
    #17 void std::_Bind<std::_Mem_fn<void (CScheduler::*)()> (CScheduler*)>::__call<void, , 0ul>(std::tuple<>&&, std::_Index_tuple<0ul>) /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/functional:1073 (bitcoind+0x000000500e77)
    #18 void std::_Bind<std::_Mem_fn<void (CScheduler::*)()> (CScheduler*)>::operator()<, void>() /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/functional:1131 (bitcoind+0x000000500e77)
    #19 std::_Function_handler<void (), std::_Bind<std::_Mem_fn<void (CScheduler::*)()> (CScheduler*)> >::_M_invoke(std::_Any_data const&) /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/functional:1871 (bitcoind+0x000000500e77)
    #20 std::function<void ()>::operator()() const /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/functional:2267 (bitcoind+0x0000004eae97)
    #21 void TraceThread<std::function<void ()> >(char const*, std::function<void ()>) /home/travis/build/bitcoin/bitcoin/build/bitcoin-x86_64-unknown-linux-gnu/src/./util/system.h:340 (bitcoind+0x0000004eae97)
    #22 void std::_Bind<void (*(char const*, std::function<void ()>))(char const*, std::function<void ()>)>::__call<void, , 0ul, 1ul>(std::tuple<>&&, std::_Index_tuple<0ul, 1ul>) /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/functional:1073 (bitcoind+0x00000050139c)
    #23 void std::_Bind<void (*(char const*, std::function<void ()>))(char const*, std::function<void ()>)>::operator()<, void>() /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/functional:1131 (bitcoind+0x000000501305)
    #24 boost::detail::thread_data<std::_Bind<void (*(char const*, std::function<void ()>))(char const*, std::function<void ()>)> >::run() /usr/include/boost/thread/detail/thread.hpp:116 (bitcoind+0x000000501305)
    #25 boost::this_thread::interruption_point() <null> (libboost_thread.so.1.58.0+0x0000000115d4)
  Location is heap block of size 328928 at 0x7f94042a9000 allocated by main thread:
    #0 operator new(unsigned long) <null> (bitcoind+0x0000004ba2f3)
    #1 AppInitMain(InitInterfaces&) /home/travis/build/bitcoin/bitcoin/build/bitcoin-x86_64-unknown-linux-gnu/src/init.cpp:1335 (bitcoind+0x0000004da9a3)
    #2 AppInit(int, char**) /home/travis/build/bitcoin/bitcoin/build/bitcoin-x86_64-unknown-linux-gnu/src/bitcoind.cpp:171 (bitcoind+0x0000004bcc96)
    #3 main /home/travis/build/bitcoin/bitcoin/build/bitcoin-x86_64-unknown-linux-gnu/src/bitcoind.cpp:201 (bitcoind+0x0000004bcc96)
  Mutex M132887 (0x000000cd6550) created at:
    #0 pthread_mutex_trylock <null> (bitcoind+0x0000004501e0)
    #1 __gthread_mutex_trylock(pthread_mutex_t*) /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/x86_64-linux-gnu/c++/5.4.0/bits/gthr-default.h:757 (bitcoind+0x0000004c17c2)
    #2 __gthread_recursive_mutex_trylock(pthread_mutex_t*) /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/x86_64-linux-gnu/c++/5.4.0/bits/gthr-default.h:816 (bitcoind+0x0000004c17c2)
    #3 std::recursive_mutex::try_lock() /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/mutex:187 (bitcoind+0x0000004c17c2)
    #4 std::unique_lock<std::recursive_mutex>::try_lock() /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/mutex:499 (bitcoind+0x0000004c17c2)
    #5 UniqueLock<AnnotatedMixin<std::recursive_mutex>, std::unique_lock<std::recursive_mutex> >::TryEnter(char const*, char const*, int) /home/travis/build/bitcoin/bitcoin/build/bitcoin-x86_64-unknown-linux-gnu/src/./sync.h:138 (bitcoind+0x0000004c17c2)
    #6 UniqueLock /home/travis/build/bitcoin/bitcoin/build/bitcoin-x86_64-unknown-linux-gnu/src/./sync.h:148 (bitcoind+0x0000004c17c2)
    #7 Shutdown(InitInterfaces&) /home/travis/build/bitcoin/bitcoin/build/bitcoin-x86_64-unknown-linux-gnu/src/init.cpp:200 (bitcoind+0x0000004c2711)
    #8 AppInit(int, char**) /home/travis/build/bitcoin/bitcoin/build/bitcoin-x86_64-unknown-linux-gnu/src/bitcoind.cpp:185 (bitcoind+0x0000004bd41a)
    #9 main /home/travis/build/bitcoin/bitcoin/build/bitcoin-x86_64-unknown-linux-gnu/src/bitcoind.cpp:201 (bitcoind+0x0000004bd41a)
  Mutex M131465 (0x000000cd6660) created at:
    #0 pthread_mutex_lock <null> (bitcoind+0x0000004516e0)
    #1 __gthread_mutex_lock(pthread_mutex_t*) /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/x86_64-linux-gnu/c++/5.4.0/bits/gthr-default.h:748 (bitcoind+0x0000004dd10c)
    #2 __gthread_recursive_mutex_lock(pthread_mutex_t*) /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/x86_64-linux-gnu/c++/5.4.0/bits/gthr-default.h:810 (bitcoind+0x0000004dd10c)
    #3 std::recursive_mutex::lock() /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/mutex:176 (bitcoind+0x0000004dd10c)
    #4 std::unique_lock<std::recursive_mutex>::lock() /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/mutex:485 (bitcoind+0x0000004dd10c)
    #5 UniqueLock<AnnotatedMixin<std::recursive_mutex>, std::unique_lock<std::recursive_mutex> >::Enter(char const*, char const*, int) /home/travis/build/bitcoin/bitcoin/build/bitcoin-x86_64-unknown-linux-gnu/src/./sync.h:129 (bitcoind+0x0000004dd10c)
    #6 UniqueLock /home/travis/build/bitcoin/bitcoin/build/bitcoin-x86_64-unknown-linux-gnu/src/./sync.h:150 (bitcoind+0x0000004dd10c)
    #7 AppInitMain(InitInterfaces&) /home/travis/build/bitcoin/bitcoin/build/bitcoin-x86_64-unknown-linux-gnu/src/init.cpp:1477 (bitcoind+0x0000004dd10c)
    #8 AppInit(int, char**) /home/travis/build/bitcoin/bitcoin/build/bitcoin-x86_64-unknown-linux-gnu/src/bitcoind.cpp:171 (bitcoind+0x0000004bcc96)
    #9 main /home/travis/build/bitcoin/bitcoin/build/bitcoin-x86_64-unknown-linux-gnu/src/bitcoind.cpp:201 (bitcoind+0x0000004bcc96)
  Mutex M131617 (0x7f94042f9350) created at:
    #0 pthread_mutex_lock <null> (bitcoind+0x0000004516e0)
    #1 __gthread_mutex_lock(pthread_mutex_t*) /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/x86_64-linux-gnu/c++/5.4.0/bits/gthr-default.h:748 (bitcoind+0x000000514ac3)
    #2 __gthread_recursive_mutex_lock(pthread_mutex_t*) /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/x86_64-linux-gnu/c++/5.4.0/bits/gthr-default.h:810 (bitcoind+0x000000514ac3)
    #3 std::recursive_mutex::lock() /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/mutex:176 (bitcoind+0x000000514ac3)
    #4 std::unique_lock<std::recursive_mutex>::lock() /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/mutex:485 (bitcoind+0x000000514ac3)
    #5 UniqueLock<AnnotatedMixin<std::recursive_mutex>, std::unique_lock<std::recursive_mutex> >::Enter(char const*, char const*, int) /home/travis/build/bitcoin/bitcoin/build/bitcoin-x86_64-unknown-linux-gnu/src/./sync.h:129 (bitcoind+0x000000514ac3)
    #6 UniqueLock /home/travis/build/bitcoin/bitcoin/build/bitcoin-x86_64-unknown-linux-gnu/src/./sync.h:150 (bitcoind+0x000000514ac3)
    #7 CConnman::DisconnectNodes() /home/travis/build/bitcoin/bitcoin/build/bitcoin-x86_64-unknown-linux-gnu/src/net.cpp:978 (bitcoind+0x000000514ac3)
    #8 CConnman::ThreadSocketHandler() /home/travis/build/bitcoin/bitcoin/build/bitcoin-x86_64-unknown-linux-gnu/src/net.cpp:1375 (bitcoind+0x000000518d67)
    #9 void std::_Mem_fn_base<void (CConnman::*)(), true>::operator()<, void>(CConnman*) const /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/functional:600 (bitcoind+0x0000005349a7)
    #10 void std::_Bind<std::_Mem_fn<void (CConnman::*)()> (CConnman*)>::__call<void, , 0ul>(std::tuple<>&&, std::_Index_tuple<0ul>) /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/functional:1073 (bitcoind+0x0000005349a7)
    #11 void std::_Bind<std::_Mem_fn<void (CConnman::*)()> (CConnman*)>::operator()<, void>() /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/functional:1131 (bitcoind+0x0000005349a7)
    #12 std::_Function_handler<void (), std::_Bind<std::_Mem_fn<void (CConnman::*)()> (CConnman*)> >::_M_invoke(std::_Any_data const&) /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/functional:1871 (bitcoind+0x0000005349a7)
    #13 std::function<void ()>::operator()() const /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/functional:2267 (bitcoind+0x0000004eae97)
    #14 void TraceThread<std::function<void ()> >(char const*, std::function<void ()>) /home/travis/build/bitcoin/bitcoin/build/bitcoin-x86_64-unknown-linux-gnu/src/./util/system.h:340 (bitcoind+0x0000004eae97)
    #15 void std::_Bind_simple<void (*(char const*, std::function<void ()>))(char const*, std::function<void ()>)>::_M_invoke<0ul, 1ul>(std::_Index_tuple<0ul, 1ul>) /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/functional:1530 (bitcoind+0x000000534e82)
    #16 std::_Bind_simple<void (*(char const*, std::function<void ()>))(char const*, std::function<void ()>)>::operator()() /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/functional:1520 (bitcoind+0x000000534e82)
    #17 std::thread::_Impl<std::_Bind_simple<void (*(char const*, std::function<void ()>))(char const*, std::function<void ()>)> >::_M_run() /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/thread:115 (bitcoind+0x000000534e82)
    #18 std::this_thread::__sleep_for(std::chrono::duration<long, std::ratio<1l, 1l> >, std::chrono::duration<long, std::ratio<1l, 1000000000l> >) <null> (libstdc++.so.6+0x0000000b8c7f)
  Thread T2 'bitcoin-schedul' (tid=28636, running) created by main thread at:
    #0 pthread_create <null> (bitcoind+0x00000043a5a6)
    #1 boost::thread::start_thread_noexcept() <null> (libboost_thread.so.1.58.0+0x0000000102e8)
    #2 thread<std::_Bind<void (*(const char *, std::function<void ()>))(const char *, std::function<void ()>)> &> /usr/include/boost/thread/detail/thread.hpp:266 (bitcoind+0x000000501102)
    #3 boost::thread* boost::thread_group::create_thread<std::_Bind<void (*(char const*, std::function<void ()>))(char const*, std::function<void ()>)> >(std::_Bind<void (*(char const*, std::function<void ()>))(char const*, std::function<void ()>)>) /usr/include/boost/thread/detail/thread_group.hpp:78 (bitcoind+0x0000004ead7c)
    #4 AppInitMain(InitInterfaces&) /home/travis/build/bitcoin/bitcoin/build/bitcoin-x86_64-unknown-linux-gnu/src/init.cpp:1284 (bitcoind+0x0000004da47e)
    #5 AppInit(int, char**) /home/travis/build/bitcoin/bitcoin/build/bitcoin-x86_64-unknown-linux-gnu/src/bitcoind.cpp:171 (bitcoind+0x0000004bcc96)
    #6 main /home/travis/build/bitcoin/bitcoin/build/bitcoin-x86_64-unknown-linux-gnu/src/bitcoind.cpp:201 (bitcoind+0x0000004bcc96)
SUMMARY: ThreadSanitizer: data race /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/stl_vector.h:1439 in std::vector<CNode*, std::allocator<CNode*> >::_M_erase_at_end(CNode**)
==================
ThreadSanitizer: reported 1 warnings
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.