我想知道河马会做什么来拦截 exit call函数例如如下代码所示:

   MockRepository mocks;
   mocks.ExpectCallFunc(exit).With(2).Throw(std::exception());
有帮助吗?

解决方案

进行拦截的代码位于 hippomocks.h. 。它修改内存保护标志以允许写入所提供的函数指针的地址,然后写入跳转指令来代替函数的初始字节。当不再需要钩子时,原始字节被恢复。这与例如 微软少走弯路 图书馆。

其他提示

它将传递的功能(在这种情况下,在这种情况下是一个简单的函数指针)到char *,允许允许操作系统才能写入它(在Windows上使用Mprotect和VirtualProtect),然后修改前5个14个字节是无条件跳转指令。它将生成的(使用模板)函数的地址置于该地点的相同签名,有效地覆盖功能。

如果您希望您可以直接重复使用HippoMocks的代码,通过构造具有正确参数的堆栈上的类替换对象。您还可以复制代码(在Github上的最新海马中,支持32/64位X86,ARM和Thumb)。它围绕200号线,所以相对较高。您需要复制哈利维尔类和未保护的类;第一个允许它将成员函数指针投射到任何其他类型(与重新诠释_cast不可能),第二个包装操作系统的UnProtect(和重新调整)呼叫。

在清理C ++ 11的代码时,我还提取了这个子集确切地说,所以您现在可以使用详细/ replace.h文件来获得这样做的代码。对于直接链接,查看 https://github.com /dascandy/hippomocks/blob/cpp11/hippomocks/detail/replace.h

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top