palacaze / sigslot

A simple C++14 signal-slots implementation

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Crash with Visual Studio 2015 (Update 3)

IceflowRE opened this issue · comments

Tested with 70a7b53

/OPT:NOICF is set.

main.cpp

// # define _ITERATOR_DEBUG_LEVEL 0
#include "sigslot.h"
#include <iostream>

void f() { std::cout << "free function\n"; }

struct s {
	void m() { std::cout << "member function\n"; }
	static void sm() { std::cout << "static member function\n"; }
};

struct o {
	void operator()() { std::cout << "function object\n"; }
};

int main() {
	s d;
	auto lambda = []() { std::cout << "lambda\n"; };
	auto gen_lambda = [](auto && ... /*a*/) { std::cout << "generic lambda\n"; };

	// declare a signal instance with no arguments
	sigslot::signal<> sig;

	// sigslot::signal will connect to any callable provided it has compatible
	// arguments. Here are diverse examples
	sig.connect(f);
	sig.connect(&s::m, &d);
	sig.connect(&s::sm);
	sig.connect(o());
	sig.connect(lambda);
	sig.connect(gen_lambda);

	// emit a signal
	sig();

	return 0;
}
>	ConsoleApplication1.exe!std::_Iterator_base12::_Adopt(const std::_Container_base12 * _Parent) Line 166	C++
 	ConsoleApplication1.exe!std::_Vector_const_iterator<std::_Vector_val<std::_Simple_types<sigslot::signal_base<std::mutex>::group_type> > >::_Vector_const_iterator<std::_Vector_val<std::_Simple_types<sigslot::signal_base<std::mutex>::group_type> > >(sigslot::signal_base<std::mutex>::group_type * _Parg, const std::_Container_base12 * _Pvector) Line 48	C++
 	ConsoleApplication1.exe!std::_Vector_iterator<std::_Vector_val<std::_Simple_types<sigslot::signal_base<std::mutex>::group_type> > >::_Vector_iterator<std::_Vector_val<std::_Simple_types<sigslot::signal_base<std::mutex>::group_type> > >(sigslot::signal_base<std::mutex>::group_type * _Parg, const std::_Container_base12 * _Pvector) Line 314	C++
 	ConsoleApplication1.exe!std::vector<sigslot::signal_base<std::mutex>::group_type,std::allocator<sigslot::signal_base<std::mutex>::group_type> >::begin() Line 1058	C++
 	ConsoleApplication1.exe!sigslot::signal_base<std::mutex>::add_slot(std::shared_ptr<sigslot::detail::slot_base<> > && s) Line 1460	C++
 	ConsoleApplication1.exe!sigslot::signal_base<std::mutex>::connect<void (__cdecl&)(void)>(void(*)() c, int gid) Line 1148	C++
 	ConsoleApplication1.exe!main() Line 26	C++

After adding # define _ITERATOR_DEBUG_LEVEL 0 it crashs somewhere else:

>	ucrtbased.dll!_free_dbg(void * block, int block_use) Line 1026	C++
 	ConsoleApplication1.exe!operator delete(void * block) Line 21	C++
 	ConsoleApplication1.exe!std::_Deallocate(void * _Ptr, unsigned __int64 _Count, unsigned __int64 _Sz) Line 133	C++
 	ConsoleApplication1.exe!std::allocator<sigslot::signal_base<std::mutex>::group_type>::deallocate(sigslot::signal_base<std::mutex>::group_type * _Ptr, unsigned __int64 _Count) Line 721	C++
 	ConsoleApplication1.exe!std::_Wrap_alloc<std::allocator<sigslot::signal_base<std::mutex>::group_type> >::deallocate(sigslot::signal_base<std::mutex>::group_type * _Ptr, unsigned __int64 _Count) Line 988	C++
 	ConsoleApplication1.exe!std::vector<sigslot::signal_base<std::mutex>::group_type,std::allocator<sigslot::signal_base<std::mutex>::group_type> >::_Reallocate(unsigned __int64 _Count) Line 1619	C++
 	ConsoleApplication1.exe!std::vector<sigslot::signal_base<std::mutex>::group_type,std::allocator<sigslot::signal_base<std::mutex>::group_type> >::_Reserve(unsigned __int64 _Count) Line 1633	C++
 	ConsoleApplication1.exe!std::vector<sigslot::signal_base<std::mutex>::group_type,std::allocator<sigslot::signal_base<std::mutex>::group_type> >::emplace_back<sigslot::signal_base<std::mutex>::group_type>(sigslot::signal_base<std::mutex>::group_type && <_Val_0>) Line 928	C++
 	ConsoleApplication1.exe!std::vector<sigslot::signal_base<std::mutex>::group_type,std::allocator<sigslot::signal_base<std::mutex>::group_type> >::emplace<sigslot::signal_base<std::mutex>::group_type>(std::_Vector_const_iterator<std::_Vector_val<std::_Simple_types<sigslot::signal_base<std::mutex>::group_type> > > _Where, sigslot::signal_base<std::mutex>::group_type && <_Val_0>) Line 945	C++
 	ConsoleApplication1.exe!std::vector<sigslot::signal_base<std::mutex>::group_type,std::allocator<sigslot::signal_base<std::mutex>::group_type> >::insert(std::_Vector_const_iterator<std::_Vector_val<std::_Simple_types<sigslot::signal_base<std::mutex>::group_type> > > _Where, sigslot::signal_base<std::mutex>::group_type && _Val) Line 920	C++
 	ConsoleApplication1.exe!sigslot::signal_base<std::mutex>::add_slot(std::shared_ptr<sigslot::detail::slot_base<> > && s) Line 1467	C++
 	ConsoleApplication1.exe!sigslot::signal_base<std::mutex>::connect<void (__cdecl&)(void)>(void(*)() c, int gid) Line 1148	C++
 	ConsoleApplication1.exe!main() Line 26	C++

I cannot reproduce it on the oldest MSVC version I have access to (MSVC 2017 15.4.4).

The backtrace is highly suspicious, it crashes while allocating some space in the vector. I think this particular compiler hardly qualifies as 2014 compliant, I would not be surprised if it were a compiler bug.

I cannot reproduce it on the oldest MSVC version I have access to (MSVC 2017 15.4.4).

The backtrace is highly suspicious, it crashes while allocating some space in the vector. I think this particular compiler hardly qualifies as 2014 compliant, I would not be surprised if it were a compiler bug.

Thinking the same.
Btw here: https://my.visualstudio.com/Downloads?q=visual%20studio%202015&wt.mc_id=o~msft~vscom~older-downloads

Ok, thanks for the link.

My sole Windows installation is the computer of my employer. I managed to get MSVC 2017 installed a few years ago but it is completely locked down, I cannot do anything about it.

In the mean time I updated the REAME to mention that MSVC 2017 and up are working. If this is fine with you I will declare this won't fix.