Hello,
I have a weird access violation when using boost::function which is passed from one DLL to another.
At work we use an engine that loads libraries at runtime. One of those libraries provides a class, that looks like that:
class CLib {
public:
LIB_API CLib(void);
typedef boost::function Func;
LIB_API void virtual Invoke(Func * func);
};
Another library tries to make use of this lib by
void freedummy()
{
int x = 0;
}
CLib::Func f = freedummy;
f(); // testinvoke locally
c.Invoke(&f); // passing to dll
The invocation fails hard with Visual Studio 2008 SP1 (Windows 7 64bit, application as 32 bit) when passing to the other dll.
The result is a call to a function address that points to nomans-land (c.Invoke()), whereas the direct f() call invokes the freedummy correctly.
I have tried to create a very basic reproducer for this case and I could not make it crash.
I tried to track down the execution of freedummy in the disassembler. The f-Pointer remains the same all the time but when
boost::function0<void>::operator()() gets called on the lib the ptr to f remains correct but the inner function_ptr pointing to freedummy gets corrupted and pointing into garbage.
Since I could NOT reproduce it with a simple test setup and I actually am not very sure why this fails I am a bit out of ideas.
Can there be somehow a misalignment or different assembler (The dlls may have been compiled with different settings, not sure). I just remembered that this line: vtable_type* get_vtable() const {
return reinterpret_cast(
reinterpret_caststd::size_t(vtable) & ~static_cast(0x01));
}
(in function_template.hpp on 678) looked different in the disassembler when called f() in the main executable compared to the invocation in CLib in the external dll.
Can I somehow get a better grip on what's happening? My assembler is not that strong that I could understand all those calls when journeying down the boost call stack.
Any hint appreciated,
Sam
--
Empfehlen Sie GMX DSL Ihren Freunden und Bekannten und wir
belohnen Sie mit bis zu 50,- Euro! https://freundschaftswerbung.gmx.de