我想知道hippomocks拦截exit
调用函数的作用,例如如下代码所示:
MockRepository mocks;
mocks.ExpectCallFunc(exit).With(2).Throw(std::exception());
答案 0 :(得分:5)
执行拦截的代码位于hippomocks.h
。它修改了内存保护标志以允许写入所提供的函数指针的地址,然后写入跳转指令来代替函数的初始字节。当不再需要钩子时,恢复原始字节。这与Microsoft Detours库使用的方法相同。
答案 1 :(得分:5)
它将传入的函数(在本例中是一个简单的函数指针)转换为char *,要求操作系统很好地写入它(在Windows上使用Unices和VirtualProtect上的mprotect),然后修改前5个到14个字节是无条件跳转指令。它将生成的(使用模板)函数的地址放在相同的签名中,有效地覆盖了函数。
如果您希望直接重用HippoMocks的代码,可以使用正确的参数在堆栈上构造类Replace的对象。您也可以复制出代码(在GitHub上的最新hippomocks.h中,32/64位x86,支持ARM和拇指)。它在200线附近,所以相对较高。你还需要复制出horrible_cast类和Unprotect类;第一个允许它将成员函数指针强制转换为任何其他类型(使用reinterpret_cast是不可能的),第二个包含特定于操作系统的unprotect(和reprotect)调用。
在清理C ++ 11的代码时,我还提取了这个子集,因此您现在可以使用detail / replace.h文件来获取执行此操作的代码。如需直接链接,请查看https://github.com/dascandy/hippomocks/blob/cpp11/HippoMocks/detail/replace.h。