如何检查一个函数是否被另一个函数调用

How can I check a function was called by another function?

本文关键字:是否 函数 另一个 函数调用 一个 何检查 检查      更新时间:2023-10-16

我目前正在努力确保一个类的成员函数仅被另一个类中的成员函数调用。

体系结构是强加的,不能更改,端口意味着在调用b.call()之前必须在a.call()中完成一些逻辑。因此a.call()调用b.call()来简化事情并确保顺序得到遵守。

我找到了这个问题的答案。只是,问题是我使用的是类,并且这两个类具有相同的成员函数名,因此#define试图替换所有具有不同原型的出现。

我推荐使用密钥模式。它非常适合对谁可以使用您的函数进行操作进行细粒度控制。

在我的脑海中,选项是:

  • b.call设为私有,并使baa.call添加为friend
  • b.call转换为一个类,并将主体放入一个私有构造函数中,aa.call作为friend
  • grep b.call的源代码,确保唯一的调用在a.call中,并在声明处添加一条注释,说明"如果调用此函数,您将被解雇"
  • 更改b.call,使其至少将所需的一个值作为参数(即使它忽略它并使用其他地方的值)

是否可以将b.call更改为引用a?这样,b.call可以调用a.call本身:

struct A {
    void call() {
        // do stuff
    }
};
struct B {
    void call(A & a) {
        a.call();
        // do stuff
    }
};

这确保了CCD_ 22总是在执行CCD_ 23的其余部分之前被调用。

使用标志怎么样?

a.call()
{
    // ...
    flag = 1;
    b.call();
    flag = 0;
}
b.call()
{
    if (flag == 0)
        return;
    // ...
}

如果你为某个平台(比如x86或x64)编程,并且你知道调用约定(例如cdecl),那么你可以从堆栈中获得这些信息

假设您想要检查调用该函数的对象,那么在调用成员函数之前使用推送到堆栈的this指针:获取this指针并将其与您想要的对象(this_pointer == a)进行比较

如果要检查某个函数,请从堆栈中获取调用方地址,并对照该函数进行检查:caller_address == A::call。如果它是一个虚拟函数,请使用this指针来获取vtable

根据调用约定和在堆栈上推送变量的顺序,您可能必须首先检查输入变量的大小,才能获得所需的信息。

相关文章: