gpt4 book ai didi

c - 如何在 C 中模拟 Linux 系统调用

转载 作者:太空狗 更新时间:2023-10-29 12:24:51 25 4
gpt4 key购买 nike

在编写使用 linux 系统调用的 C 模块时,模拟这些调用以测试模块的最佳做法是什么?是否有任何库为 linux 系统调用提供模拟?

"my-module.h"- 接口(interface)描述

#include "unistd.h"
int mm_foo(int);
int mm_bar(int);

"my-module.c"- 要测试的模块。

#include "my-module.h"
int mm_foo(int arg) {

...
int write_ret = write(...);
...

};
int mm_bar(int arg) {

...
int read_ret = read(...);
...
};

“my-module.test.cpp” - 单元测试我期望它的工作方式(例如我正在使用谷歌单元测试)。

#include "my-module.h"

TEST(MyModule, FooTest) {

reset(write_mock);

...

// this is pure imagination
write_mock.return_value = -1; // failure
write_mock.expected_args.fd = somefd;

int ret_val = mm_foo(somearg);

ASSERT_EQ(exp_val, ret_val);
verify(write_mock);

}

当我想模拟不是系统调用的东西时,我可以从头文件中创建接口(interface)的替代实现并将模拟实现编译到测试中。但是我如何通过系统调用来做到这一点。我可以重新实现(覆盖)一个函数调用吗?我的模块是否应该为函数调用调用包装器模块?

最佳答案

一般来说,您希望为您正在测试的每个系统调用创建一个包装器。 A good way to do this and make your code easy to follow, would be just to use the ld option: --wrap .这使您可以在构建时交换符号,而无需重新编写代码以使用包装函数代替真正的 libc 函数。

Additionally, you could use LD_PRELOAD to override libc system call wrapper functions ,就像 rootkit/病毒编写者所做的那样,但涉及的工作不仅仅是使用 --wrap 功能。

最后,您可以 utilize a unit test framework (i.e. CUnit)在您的包装函数中,简化您的测试。

关于c - 如何在 C 中模拟 Linux 系统调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45001372/

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