【发布时间】:2017-02-12 16:21:40
【问题描述】:
您能否提供任何示例如何验证函数 X() 是从函数 Y() 而不是从函数 Z() 调用的?
使用“C”或汇编语言?
提前致谢。
更新:02-03-2015
-
假设内核源代码有很多驱动程序调用相同的函数,例如 SPI(串行外围接口)和 GPIO(通用输入输出)的驱动程序源代码正在调用相同的函数,例如“bzero()”。
void bzero(void *s, size_t n);
-
我要测试SPI和GPIO驱动(驱动代码不能修改)。为此,我编写了测试驱动程序。我只能调用从我的测试驱动程序公开的函数。
uint8_t SPI_read_write(uint8_t byte_out, char *s) // 函数1 { bzero(s,sizeof(struct_global1)); 返回字节输入; }
uint8_t GPIO_read_write(uint8_t byte_out, char *s)// 函数2 { bzero(s,sizeof(struct_global2)); 返回字节输入; }
int main()// 测试驱动 { SPI_read_write(arg1,arg2);// 当我从测试驱动调用这个函数时,它会调用 bzero
} 函数 SPI_read_write() 和 GPIO_read_write() 函数都调用“bzero”函数。 我需要确保仅在任何实例中从 SPI_read_write() 函数调用“bzero”。
2017 年 4 月 15 日更新
我不知道哪条线不清楚?一些函数 fun1() 可以从 N 个其他函数中调用。如何确定哪个函数调用了 fun1()?
可能和栈、链接寄存器有关……
【问题讨论】:
-
使其成为与
X相同的翻译单元中的静态函数。如果Y也在那里,那么你就不走运了。但坦率地说,我认为这是(字面意思)XY Problem -
您可以使用调试器检查它,例如来自 Code::blocks 的内置调试器。
-
使用
__builtin_return_address检查它? -
确实是 XY 问题。如果调用链很重要(间接调用呢?),你的代码就被设计破坏了。
-
你必须知道每个函数的地址是什么,然后沿着栈往上走,检查栈帧。