Boost logo

Boost Users :

Subject: [Boost-users] boost::function and cross dll call issue
From: ariasgore_at_[hidden]
Date: 2012-05-04 13:55:23


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<void ()> 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<vtable_type*>(
               reinterpret_cast<std::size_t>(vtable) & ~static_cast<size_t>(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

Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net