我正在使用 UnitTest++ 框架对我负责的一些 C 代码实现单元测试。最终产品被嵌入并使用 const 结构来保存配置信息。由于目标主机可以异步修改配置,因此结构的成员都是易失的。一些结构也被声明为 volatile。
当我使用 const_cast 尝试修改 UnitTest Windows 7 主机上缺少 volatile 关键字的结构实例时,我遇到了分段错误。这对我来说很有意义。但是,如果结构实例是使用 volatile 关键字声明的,则测试通过。这对我来说没有意义。
这是一个快速代码示例,显示了 Win7 上 gcc 的问题。切换定义值会导致段错误出现或不出现,具体取决于是否使用了结构的 volatile 实例。
typedef struct
{
volatile int foo;
volatile int bar;
} TestStruct;
const TestStruct constStruct = { 1, 2};
volatile const TestStruct volatileConstStruct = { 3, 4};
#define SEG_FAULT 0
int main(void)
{
TestStruct * constPtr = const_cast<TestStruct*>(&constStruct);
TestStruct * constVolPtr = const_cast<TestStruct*>(&volatileConstStruct);
#if(SEG_FAULT == 0)
constVolPtr->foo = 10;
#else
constPtr->foo = 20;
#endif
}
谁能帮我理解为什么 volatile 关键字为段错误提供了解决方法?另外,任何人都可以建议一种方法来允许我修改结构中的值以进行单元测试,而无需将 volatile 关键字添加到所有结构实例中?
编辑:
我刚刚发现你可以在 C 中做到这一点:
#define const
在测试夹具中包含上面有效的“const undefine”允许我的目标编译器看到 const 关键字并将结构正确地放入闪存中。但是,UnitTest++ 编译器上的预处理器去掉了 const 关键字,所以我的测试夹具能够修改结构。
此解决方案的缺点是我无法添加单元测试来验证函数调用的正确 const 操作。但是,由于从结构实例中删除 const 不是一种选择(需要将数据放在闪存中),这似乎是我必须忍受的一个缺点。