水木社区手机版
首页
|版面-编程技术(Programming)|
新版wap站已上线
返回
1/1
|
转到
主题:c/cpp真是一不小心就踩雷
楼主
|
stub
|
2023-11-17 11:50:12
|
展开
#include <stdio.h>
void check(short *h,long *k)
{
*h=5;
*k=6;
if (*h == 5)
printf("strict aliasing problem\n");
}
int main(void)
{
long k[1];
check((short *)k,k);
return 0;
}
check代码居然是未定义的. 用O0编译和O2编译结果完全不同
--
FROM 61.48.14.*
3楼
|
stub
|
2023-11-17 13:24:41
|
展开
【 在 eggcar 的大作中提到: 】
: 这不是显然的么,编译器认为*h=5之后没有赋值操作,if判断直接可以省略,最基础的编译优化
: 你要加volatile避免编译器触碰才行
你如果short改成long就不是未定义
--
FROM 61.48.14.*
1/1
|
转到
选择讨论区
首页
|
分区
|
热推
BYR-Team
©
2010.
KBS Dev-Team
©
2011
登录完整版