gpt4 book ai didi

c - C 中的运行时模拟?

转载 作者:太空狗 更新时间:2023-10-29 16:53:31 26 4
gpt4 key购买 nike

这已经在我的列表中等待很长时间了。简而言之 - 我需要在 dummy() ON RUN-TIME 的位置运行 mocked_dummy(),而不修改 factorial( )。我不关心软件的入口点。我可以添加任意数量的附加功能(但不能修改 /*---- 内的代码,不要修改 ----*/)。

我为什么需要这个?
对一些遗留的 C 模块进行单元测试。我知道周围有很多可用的工具,但如果可以进行运行时模拟,我可以更改我的 UT 方法(添加可重用组件)让我的生活更轻松:)。

平台/环境?
Linux、ARM、gcc。

我正在尝试的方法?

  • 我知道 GDB 使用陷阱/非法指令来添加断点 (gdb internals)。
  • 使代码可自修改。
  • 用非法指令替换dummy()代码段,并返回作为紧接的下一条指令。
  • 控制转移到陷阱处理程序。
  • 陷阱处理程序是一个可重用的函数,它从 unix 域套接字中读取数据。
  • 传递了 mocked_dummy() 函数的地址(从映射文件中读取)。
  • 模拟函数执行。

从这里开始会有问题。我还发现这种方法很乏味并且需要大量编码,其中一些还需要汇编。

我还发现,在gcc下每个函数调用都可以是hooked / instrumented , 但同样不是很有用,因为该函数旨在被模拟,无论如何都会被执行。

我可以使用任何其他方法吗?

#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--;
}
dummy();
return fact;
}
/*---- do not modify ----*/

int main(int argc, char * argv[])
{
int (*fp)(int) = atoi(argv[1]);
printf("fp = %x\n",fp);
printf("factorial of 5 is = %d\n",fp(5));
printf("factorial of 5 is = %d\n",factorial(5));
return 1;
}

最佳答案

test-dept是一个相对较新的 C 单元测试框架,允许您对函数进行运行时 stub 。我发现它非常易于使用 - 这是他们文档中的示例:

void test_stringify_cannot_malloc_returns_sane_result() {
replace_function(&malloc, &always_failing_malloc);
char *h = stringify('h');
assert_string_equals("cannot_stringify", h);
}

虽然下载部分有点过时,但似乎开发得相当积极 - 作者非常及时地解决了我遇到的问题。您可以获得最新版本(我一直在使用,没有问题):

svn checkout http://test-dept.googlecode.com/svn/trunk/ test-dept-read-only

该版本最后更新于 2011 年 10 月。

但是,由于 stub 是 achieved using assembler ,可能需要一些努力才能使其支持 ARM。

关于c - C 中的运行时模拟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9613581/

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