C标准下局部volatile变量与指针转换的编译器优化问题
函数指针转数据指针的union方案失效与volatile变量的编译器优化疑问
调试需求下需访问函数的机器码指令,最初尝试用union将函数指针转换为数据指针,代码如下:
void exampleCode(void) { volatile union { uint8_t ** pptr; void (* pFunc)(void); } u; uint8_t ** copyPptr; uint8_t * resultPtr; #if 1 u.pptr = (uint8_t **)0x10000000; #endif u.pFunc = &myFunction; copyPptr = u.pptr; /* 问题出在这里: */ resultPtr = copyPptr[109]; *resultPtr = 0xA5; }
移除u.pptr = (uint8_t **)0x10000000语句后,编译器判定copyPptr的值未定义(C标准不允许函数指针转换为数据指针),进而优化掉最后两行代码。但volatile关键字要求编译器不得优化对u.pptr的读取操作,我认为编译器应当假设读取结果有效,不应优化后续代码。
我已经找到其他解决方案,提问仅为理解该union方案失效的原因,以便规避后续问题。实际场景是调试时访问某目标文件库中的static变量,通过函数内的地址定位该变量。
通过以下简化代码可在gcc -O3下复现问题:
char a, c; char * b = &a; void testCode(void) { char * volatile x; c = 'A'; *x = 'X'; }
核心疑问:
- 该GCC for ARM的优化行为是符合C标准,还是属于编译器bug?
- 现代C标准中,非静态局部volatile变量是否会被视为未初始化?
内容的提问来源于stack exchange,提问作者Martin Rosenau
相关产品推荐
相关产品推荐

