Как мой асинхронный вызов «Условный переход или перемещение зависит от неинициализированных значений»? - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь эмулировать игровой сервер, но, когда я пытаюсь запустить свой LoginServer асинхронно, я получаю сообщение об ошибке «Условный переход или перемещение зависит от неинициализированных значений» через Valgrind.Однако, если я не попытаюсь запустить его асинхронно и просто запустить сервер из основного потока, я не получу сообщение об ошибке.Выдает ли Valgrind ложное срабатывание или я просто схожу с ума?

Я предоставил упрощенный пример для справки

#include <future>
#include <iostream>

class A
{
        public:
                A()
                {
                        this->i = 0;
                }
                A(const A &a2)
                {
                        this->i = a2.i;
                }
                A(A&& a)
                {
                        this->i = std::move(a.i);
                }
                ~A()
                {
                        this->i = 0;
                }
                bool setI(int i)
                {
                        this->i = i;
                        return true;
                }
                int getI()
                {
                        return i;
                }
                A& operator=(const A& a)
                {
                        this->i = a.i;
                        return *this;
                }

        private:
                int i;
};


int main()
{
        A a = A();
        std::async(std::launch::async, &A::setI, &a, 2);
        std::cout << a.getI() << '\n';

        std::async(std::launch::async, &A::setI, &a, 3);
        std::cout << a.getI() << '\n';

        std::async(std::launch::async, &A::setI, &a, 4);
        std::cout << a.getI() << '\n';

        std::async(std::launch::async, &A::setI, &a, 5);
        std::cout << a.getI() << '\n';
        return 0;
}

Отчет Valgrind

==10108== Memcheck, a memory error detector
==10108== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==10108== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==10108== Command: ./test
==10108==
==10108== Conditional jump or move depends on uninitialised value(s)
==10108==    at 0xFFFF0FCC: ???
==10108==  Uninitialised value was created by a heap allocation
==10108==    at 0x4847D4C: operator new(unsigned int) (vg_replace_malloc.c:328)
==10108==    by 0x160E3: __gnu_cxx::new_allocator<std::_Sp_counted_ptr_inplace<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool>, std::allocator<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool> >, (__gnu_cxx::_Lock_policy)1> >::allocate(unsigned int, void const*) (new_allocator.h:104)
==10108==    by 0x15C77: std::allocator_traits<std::allocator<std::_Sp_counted_ptr_inplace<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool>, std::allocator<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool> >, (__gnu_cxx::_Lock_policy)1> > >::allocate(std::allocator<std::_Sp_counted_ptr_inplace<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool>, std::allocator<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool> >, (__gnu_cxx::_Lock_policy)1> >&, unsigned int) (alloc_traits.h:436)
==10108==    by 0x15767: std::__allocated_ptr<std::allocator<std::_Sp_counted_ptr_inplace<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool>, std::allocator<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool> >, (__gnu_cxx::_Lock_policy)1> > > std::__allocate_guarded<std::allocator<std::_Sp_counted_ptr_inplace<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool>, std::allocator<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool> >, (__gnu_cxx::_Lock_policy)1> > >(std::allocator<std::_Sp_counted_ptr_inplace<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool>, std::allocator<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool> >, (__gnu_cxx::_Lock_policy)1> >&) (allocated_ptr.h:103)
==10108==    by 0x1548B: std::__shared_count<(__gnu_cxx::_Lock_policy)1>::__shared_count<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool>, std::allocator<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool> >, std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)> >(std::_Sp_make_shared_tag, std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool>*, std::allocator<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool> > const&, std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>&&) (shared_ptr_base.h:613)
==10108==    by 0x15293: std::__shared_ptr<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool>, (__gnu_cxx::_Lock_policy)1>::__shared_ptr<std::allocator<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool> >, std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)> >(std::_Sp_make_shared_tag, std::allocator<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool> > const&, std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>&&) (shared_ptr_base.h:1100)
==10108==    by 0x1513B: std::shared_ptr<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool> >::shared_ptr<std::allocator<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool> >, std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)> >(std::_Sp_make_shared_tag, std::allocator<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool> > const&, std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>&&) (shared_ptr.h:319)
==10108==    by 0x14DEF: std::shared_ptr<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool> > std::allocate_shared<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool>, std::allocator<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool> >, std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)> >(std::allocator<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool> > const&, std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>&&) (shared_ptr.h:620)
==10108==    by 0x14A57: std::shared_ptr<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool> > std::make_shared<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool>, std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)> >(std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>&&) (shared_ptr.h:636)
==10108==    by 0x1446B: std::shared_ptr<std::__future_base::_State_baseV2> std::__future_base::_S_make_async_state<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)> >(std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>&&) (future:1702)
==10108==    by 0x137FF: std::future<std::result_of<std::decay<bool (A::*)(int)>::type (std::decay<A*>::type, std::decay<int>::type)>::type> std::async<bool (A::*)(int), A*, int>(std::launch, bool (A::*&&)(int), A*&&, int&&) (future:1716)
==10108==    by 0x118EF: main (main.cpp:47)
==10108==
==10108== Conditional jump or move depends on uninitialised value(s)
==10108==    at 0xFFFF0FD4: ???
==10108==  Uninitialised value was created by a heap allocation
==10108==    at 0x4847D4C: operator new(unsigned int) (vg_replace_malloc.c:328)
==10108==    by 0x160E3: __gnu_cxx::new_allocator<std::_Sp_counted_ptr_inplace<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool>, std::allocator<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool> >, (__gnu_cxx::_Lock_policy)1> >::allocate(unsigned int, void const*) (new_allocator.h:104)
==10108==    by 0x15C77: std::allocator_traits<std::allocator<std::_Sp_counted_ptr_inplace<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool>, std::allocator<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool> >, (__gnu_cxx::_Lock_policy)1> > >::allocate(std::allocator<std::_Sp_counted_ptr_inplace<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool>, std::allocator<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool> >, (__gnu_cxx::_Lock_policy)1> >&, unsigned int) (alloc_traits.h:436)
==10108==    by 0x15767: std::__allocated_ptr<std::allocator<std::_Sp_counted_ptr_inplace<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool>, std::allocator<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool> >, (__gnu_cxx::_Lock_policy)1> > > std::__allocate_guarded<std::allocator<std::_Sp_counted_ptr_inplace<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool>, std::allocator<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool> >, (__gnu_cxx::_Lock_policy)1> > >(std::allocator<std::_Sp_counted_ptr_inplace<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool>, std::allocator<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool> >, (__gnu_cxx::_Lock_policy)1> >&) (allocated_ptr.h:103)
==10108==    by 0x1548B: std::__shared_count<(__gnu_cxx::_Lock_policy)1>::__shared_count<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool>, std::allocator<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool> >, std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)> >(std::_Sp_make_shared_tag, std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool>*, std::allocator<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool> > const&, std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>&&) (shared_ptr_base.h:613)
==10108==    by 0x15293: std::__shared_ptr<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool>, (__gnu_cxx::_Lock_policy)1>::__shared_ptr<std::allocator<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool> >, std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)> >(std::_Sp_make_shared_tag, std::allocator<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool> > const&, std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>&&) (shared_ptr_base.h:1100)
==10108==    by 0x1513B: std::shared_ptr<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool> >::shared_ptr<std::allocator<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool> >, std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)> >(std::_Sp_make_shared_tag, std::allocator<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool> > const&, std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>&&) (shared_ptr.h:319)
==10108==    by 0x14DEF: std::shared_ptr<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool> > std::allocate_shared<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool>, std::allocator<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool> >, std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)> >(std::allocator<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool> > const&, std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>&&) (shared_ptr.h:620)
==10108==    by 0x14A57: std::shared_ptr<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool> > std::make_shared<std::__future_base::_Async_state_impl<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>, bool>, std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)> >(std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>&&) (shared_ptr.h:636)
==10108==    by 0x1446B: std::shared_ptr<std::__future_base::_State_baseV2> std::__future_base::_S_make_async_state<std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)> >(std::_Bind_simple<std::_Mem_fn<bool (A::*)(int)> (A*, int)>&&) (future:1702)
==10108==    by 0x137FF: std::future<std::result_of<std::decay<bool (A::*)(int)>::type (std::decay<A*>::type, std::decay<int>::type)>::type> std::async<bool (A::*)(int), A*, int>(std::launch, bool (A::*&&)(int), A*&&, int&&) (future:1716)
==10108==    by 0x118EF: main (main.cpp:47)
==10108==
2
3
4
5
==10108==
==10108== HEAP SUMMARY:
==10108==     in use at exit: 0 bytes in 0 blocks
==10108==   total heap usage: 15 allocs, 15 frees, 21,808 bytes allocated
==10108==
==10108== All heap blocks were freed -- no leaks are possible
==10108==
==10108== For counts of detected and suppressed errors, rerun with: -v
==10108== ERROR SUMMARY: 12 errors from 2 contexts (suppressed: 6 from 3)

Понятно,a и его член инициализирован, почему я получаю этот отчет?Мой компилятор или сборка valgrind выдают это без причины или я просто что-то упускаю?

У кого-нибудь есть идеи?Заранее благодарен за любую помощь.

Мой make-файл:

CC = g++

CFLAGS = -Wall -g -std=c++14 -pthread

SOURCES = main.cpp

all :
        $(CC) $(CFLAGS) $(SOURCES) -o test

clean :
        rm -f test

Скомпилирован с: g ++ (Raspbian 6.3.0-18 + rpi1 + deb9u1) 6.3.0 20170516 на Raspbian Stretch

Valgrind версия 3.13.0

...