DLL访问违例(0xc0000005):结构体成员指针安全访问求助
问题背景
不可修改的C代码A定义如下:
// fsm.h typedef unsigned char uint8; typedef signed char int8; typedef struct { uint8 var1; int8 var2; uint8 var3; } Fsm; // fsm.c Fsm fsm;
用于观测A运行时变量的C++代码B定义:
// .hpp typedef enum { STR_UINT8, STR_INT8, } DataType; typedef struct { DataType dtype; void* addr; } ScopeVar; // .cpp std::map<std::string, ScopeVar> g_scope= { { "var1", {.dtype=STR_UINT8, .addr=&fsm.var1}}, { "var2", {.dtype=STR_INT8, .addr=&fsm.var2 }}, };
需要在A运行时记录var1和var2的值,A实际运行在嵌入式设备,编译为DLL可在仿真软件中运行。
问题描述
在A任务的每次迭代中,通过以下代码收集数据:
std::string vals; for(auto iter = g_scope.begin();iter!=g_scope.end();iter++) { switch (g_scope[iter->first].dtype) { case STR_UINT8: vals = std::to_string(*static_cast<uint8*>(g_scope[iter->first].addr)); break; case STR_INT8: vals = std::to_string(*static_cast<int8*>(g_scope[iter->first].addr)); break; } // 对vals进行操作.... }
编译后的DLL无法正常执行,仿真报错:access violation(code 0xc0000005) at 0x7ff8dd7aae82: Bad read on 0x0。
调试情况
多次调试后发现以下异常现象:
- 指针值可读取,但无法传递给其他函数:
std::string vals; for(auto iter = g_scope.begin();iter!=g_scope.end();iter++) { uint8 a; switch (g_scope[iter->first].dtype) { case STR_UINT8: a = *static_cast<uint8*>(g_scope[iter->first].addr); // 仅这一行可正常运行 vals = std::to_string(a); // 执行此行触发访问违例 observer.log(a); // spdlog实例已记录a的值,但执行后立即触发异常 break; case STR_INT8: vals = std::to_string(*static_cast<int8*>(g_scope[iter->first].addr)); break; } // 对vals进行操作.... }
- 尝试用函数替代指针,失败;
- 尝试用
&fsm+offsetof(var1)作为指针,同样失败。
求助
如何安全地通过指针访问结构体成员的值?
内容的提问来源于stack exchange,提问作者Coneain
相关产品推荐
相关产品推荐

