http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55320



             Bug #: 55320

           Summary: Invalid delete with throwing copy-c'tor passed to

                    std::function

    Classification: Unclassified

           Product: gcc

           Version: 4.7.2

            Status: UNCONFIRMED

          Severity: normal

          Priority: P3

         Component: libstdc++

        AssignedTo: unassig...@gcc.gnu.org

        ReportedBy: benjamin.kirc...@gmail.com





Created attachment 28682

  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=28682

Example program



The example program attached compiles w/o warnings and crashes with an invalid

delete when executed.





$ gcc --version

gcc (Debian 4.7.2-4) 4.7.2





$ cat main.cpp

#include <functional>

#include <stdexcept>

#include <iostream>

#include <ostream>



struct functor

{

    functor() = default;

    functor(const functor&) { throw std::exception(); }

    void operator()() {}

};



int main()

try

{

    std::function<void()> func = functor();

    return 0;

}

catch (std::exception&)

{

    std::cout << "catched" << std::endl;

}





Valgrind gives me

$ valgrind --tool=memcheck ./a.out

<snip>

==...== Invalid free() / delete / delete[] / realloc()

==...==    at 0x...: operator delete(void*) (in

/usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)

==...==    by 0x...:

std::_Function_base::_Base_manager<functor>::_M_destroy(std::_Any_data&,

std::integral_constant<bool, false>) (functional:1780)

==...==    by 0x...:

std::_Function_base::_Base_manager<functor>::_M_manager(std::_Any_data&,

std::_Any_data const&, std::_Manager_operation) (functional:1804)

==...==    by 0x...: std::_Function_base::~_Function_base() (functional:1885)

==...==    by 0x...: std::function<void ()>::function<functor>(functor,

std::enable_if<!(std::is_integral<functor>::value), std::function<void

()>::_Useless>::type) (functional:2292)

<snip>



On clang/libc++ this behaves as expected.

Reply via email to