这已经在我的列表中待了很长时间.简而言之 - 我需要mocked_dummy()在dummy() ON RUN-TIME的位置运行,而无需修改factorial().我不关心软件的切入点.我可以添加任意数量的附加功能(但不能修改其中的代码/*---- do not modify ----*/).
我为什么需要这个?
对一些传统C模块进行单元测试.我知道有很多可用的工具,但如果可以运行时模拟我可以改变我的UT方法(添加可重用的组件)让我的生活更轻松:).
平台/环境?
Linux,ARM,gcc.
我正在尝试的方法?
dummy()用非法指令替换代码段,并作为紧接的下一条指令返回.mocked_dummy()传递函数的地址(从映射文件中读取).从这里开始存在问题.我还发现这种方法很繁琐,需要大量的编码,有些也在组装中.
我还发现,在gcc下,每个函数调用都可以被挂钩/检测,但同样不是很有用,因为该函数是用来模拟的,无论如何都会被执行.
我还能使用其他方法吗?
#include <stdio.h>
#include <stdlib.h>
void mocked_dummy(void)
{
printf("__%s__()\n",__func__);
}
/*---- do not modify ----*/
void dummy(void)
{
printf("__%s__()\n",__func__);
}
int factorial(int num)
{
int fact = 1;
printf("__%s__()\n",__func__);
while (num > 1)
{
fact *= num;
num--;
} …Run Code Online (Sandbox Code Playgroud)