主机测试带有硬编码内存地址的C程序

时间:2015-05-18 13:20:31

标签: c linux unit-testing memory-management functional-testing

我们将编写C代码的功能/单元测试。该C程序将作为嵌入式软件运行。但是,我们需要在Linux环境中运行测试。

问题在于测试中的部分代码如下所示:

my_addresses.h:

#define MY_BASE_ADDRESS     (0x00600000)
#define MY_OFFSET_ADDRESS   (0x108)

my_code.c

#include "my_addresses.h"

static const My_Type* my_ptr =
  (My_Type*)(MY_BASE_ADDRESS + MY_OFFSET_ADDRESS);

/* my_ptr is dereferenced and used ... */

显然,这在Linux主机环境中运行不会很好。

在测试期间,我们是否可以通过某种方式解决此问题?我们能以某种方式"重定向"程序使用其他地址,这些地址是在测试程序中分配的内存的有效地址吗?

我们的第一次尝试是取代" my_addresses.h"在测试期间使用另一个头文件,其中(extern)声明变量而不是硬定义 - 然后将malloc内存分配给MY_BASE_ADDRESS,等等。问题是"静态const" c文件中的声明。当然,您无法将变量赋值给静态const类型。

最好不要修改被测代码(尽管在最坏的情况下可能会出现这种情况)。

3 个答案:

答案 0 :(得分:5)

您可以查看例如__linux__宏并使用条件编译。在Linux上使用数组作为基础,并使其足够大以保留其中所需的所有数据。

像是一样的东西。

#ifdef __linux__
int8_t array[1024];
# define MY_BASE_ADDRESS array
#else
# define MY_BASE_ADDRESS 0x00600000
#endif

答案 1 :(得分:0)

在Linux环境中,您可以定义全局数组,然后使用此地址作为基指针。

const char my_buffer[1024];
#define my_base_addr (&my_buff)

答案 2 :(得分:0)

假设

  • 您的嵌入式内存布局足够小,可以在Linux上完整地(或在几个块中)保持模型不变,
  • 您的编译器对下面的常量内存地址表达式和
  • 感到满意 您示例中的
  • My_Type定义为typedef My_Type1_t * My_Type;

您可以(1)将嵌入式内存布局的定义与决定它的放置方式分开,并且如果为布局声明struct,则可能(2)获得某种类型安全性:

#pragma (essential: stuff to force structs to contain no extra padding)
typedef struct {
  char pad0[0x108];
  My_Type1_t foo;
  char pad1[0x210];
  My_Type2_t bar;
  ...
} Memory_Layout_t;
#pragma (preferably: something to revert to previous struct layout options)

(如果您不想计算pad1的尺寸,请使用union。)

然后制作变体:

#ifdef __linux__
Memory_Layout_t Embedded_Memory;
#  define Embedded_Memory_P (& Embedded_Memory)
#else
#  define Embedded_Memory_P ((Memory_Layout_t *) (0x00600000))
#endif

并用

引用它
static const My_Type my_ptr = & Embedded_Memory_P->foo;