gpt4 book ai didi

c++ - 如何在保持其功能的同时绕过标准 C++ 函数

转载 作者:行者123 更新时间:2023-11-30 02:55:33 25 4
gpt4 key购买 nike

我正在寻找一种能够重新定义一组 POSIX 函数但随后通过调用原始函数结束重新定义的方法。我的想法是,我正在尝试创建一个层,该层可以根据哪个“配置文件”处于事件状态来限制可以调用哪些 OS API。此“配置文件”确定允许使用哪些功能集,不应使用任何未指定的功能。

例如,如果在一个配置文件中不允许我使用 strcpy,我希望能够导致编译时错误(通过 static_assert)或在屏幕上打印一些内容,提示“此配置文件中不允许使用 strcpy” "如下所示:

我的字符串.h

#include <string.h>

char *strcpy(char *restrict s1, const char *restrict s2)
{
#if defined(PROFILE_PASS_THROUGH)
printf("strcpy is not allowed in this profile\n");
return strcpy(s1, s2);
#elif defined(PROFILE_ERROR)
static_assesrt(0, "strcpy is not allowed in this profile\n");
return 0;
#else
return strcpy(s1, s2);
#endif
}

这样我就可以在 main.cpp 中使用 MY_string.h

#define PROFILE_PASS_THROUGH
#include "MY_string.h"

int main()
{
char temp1[10];
char temp2[10];
sprintf(temp2, "Testing");
if (0 = strcpy(temp1, temp2))
{
printf("temp1 is %s\n", temp1);
}
return 0;
}

现在我意识到,由于重新定义了 strcpy,我上面编写的代码将无法正确编译,但是有没有一种方法可以在不使用宏或创建我自己的标准 c 和 c++ 库的情况下实现这种功能?

最佳答案

  1. 您可以编写一个预处理器,将对标准例程的调用更改为对您自己的例程的调用。这样的预处理器可能很复杂,具体取决于您是否需要识别完整的 C++ 语法以区分使用 namespace 等的调用,或者您可以更随意地识别调用。

  2. 您可以链接到您自己的库,生成一个去除解析名称的可重定位目标模块。您的库将包含具有标准名称的例程,例如 strcpy ,执行您想要的任何代码并调用其他名称,例如 Mystrcpy .由此产生的目标模块然后与第二个库和标准库链接。第二个库包含具有这些名称的例程,例如 Mystrcpy , 即调用原始库名称 strcpy .这样做的细节当然取决于您的链接器。目标是拥有这样的链:原始代码调用 strcpy .这已解决为 strcpy 的版本在第一个图书馆。该版本调用 Mystrcpy . Mystrcpy调用标准库 strcpy .

  3. 您可以编译为程序集并编辑程序集中的名称,以便调用您的例程而不是标准库例程。

  4. 在某些系统上,您可以使用 dlsym<dlfcn.h> 中定义的其他功能加载包含标准实现的动态库并通过 dlsym 返回的指针调用它们而不是源代码中的常用名称。

  5. GCC 链接器有一个 --wrap解决对 foo 的调用的开关到你的日常__wrap_foo并解决对 __real_foo 的调用(你会在你的实现中使用)到真正的 foo .

另见 Intercepting Arbitrary Functions on Windows, UNIX, and Macintosh OS X Platforms .

关于c++ - 如何在保持其功能的同时绕过标准 C++ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16341833/

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