gpt4 book ai didi

c++ - 如何拦截像 hippomocks 那样的自由函数调用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:10:14 34 4
gpt4 key购买 nike

我想知道 hippomocks 做了什么来拦截 exit 调用函数,例如下面的代码所示:

   MockRepository mocks;
mocks.ExpectCallFunc(exit).With(2).Throw(std::exception());

最佳答案

它将传入的函数(在本例中是一个简单的函数指针)转换为一个 char *,请求允许操作系统写入它(在 Unices 上使用 mprotect,在 Windows 上使用 VirtualProtect),然后修改前 5 个到 14 个字节是无条件跳转指令。它将具有相同签名的生成(使用模板)函数的地址放在该位置,有效地覆盖该函数。

如果您愿意,可以直接重用 HippoMocks 的代码,方法是使用正确的参数在堆栈上构造 Replace 类的对象。您也可以复制代码(在 GitHub 上最新的 hippomocks.h 中,同时支持 32/64 位 x86、ARM 和 thumb)。它在 200 线附近,所以相对较高。您还需要复制 horrible_cast 类和 Unprotect 类;第一个允许它将成员函数指针转换为任何其他类型(使用 reinterpret_cast 是不可能的),第二个包装特定于操作系统的取消保护(和重新保护)调用。

在清理 C++11 的代码时,我还提取了这个子集,因此您现在可以使用 detail/replace.h 文件来获取执行此操作的代码。有关直接链接,请查看 https://github.com/dascandy/hippomocks/blob/cpp11/HippoMocks/detail/replace.h .

关于c++ - 如何拦截像 hippomocks 那样的自由函数调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25079768/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com