在x86_32/64中,在指针和整数之间进行强制转换
Cast between a pointer and integer in x86_32/64
我有一个简单的虚拟机,我做它是为了好玩。它在一个非常低的层次上工作,并且没有任何类型的概念。一切都只是一个整数。有一些获取指针和通过指针访问内存的指令。问题是,这些指针被简单地存储为uint64_t
,并且任何指针算术都是整数算术。当将其用作指针时,机器将其强制转换为void*
。这类代码在汇编级是显而易见的,但C和C++标准不允许程序员安全地进行整数指针转换,尤其是当整数用于更改指针值时。
我不会让这个玩具虚拟机到处都是便携式的。它只是被期望在x86_32/64机器下工作,即使在完全的编译器优化之后,它似乎也能很好地工作。我认为这是因为指针在x86体系结构中被表示为整数没有什么不同。
在这种情况下,通常会应用什么样的解决方案,即语言标准没有声明某些代码是安全的,但它在目标硬件中确实应该是安全的——结果看起来确实不错?
或者作为一个更实际的问题,我如何才能让编译器(gcc)不对这样的代码执行破坏性优化
uint64_t registers[0x100];
registers[0] = (uint64_t)malloc(8);
registers[0] += 4;
registers[2] = 0;
memcpy(®isters[2], (void*)registers[0], 4);
上面不是真正的代码,但字节码指令的某个序列实际上会做与上面类似的事情。
如果您真的需要向整数投射指针,请至少使用uintptr_t
,看在意大利面条怪物的份上!此类型(及其签名的对应类型)意味着可以安全地向指针进行强制转换。然而,它不用于操作(但对于线性模型来说可能是安全的,不修改这两个值的表示)。
尽管如此,您的代码似乎没有意义,但可能会阻碍编译器主动进行优化。我想说,如果不更深入地了解你打算完成什么,很可能会有更好的方法。
相关文章:
- C++需要帮助从用户那里获得一个整数,并确保它在另外两个整数之间
- 在数字之间插入 + 或 - 符号以使其等于整数
- 禁止指针和整数之间的比较C++
- ISO C++禁止指针和整数 [-fpermissive] [c++] 之间的比较
- 查找多个向量之间的公共元素(无整数元素)
- Qt 错误 iso c++ 禁止指针和整数之间的比较 -permissive
- 递归函数,用于查找 2 个整数之间的最大值
- 如何包含整数之间的空格作为输出
- 在两个整数之间交换最右边的N位
- 打印出两个整数之间的偶数
- 错误:ISO C++禁止在指针和整数 [-fallowive] 之间进行比较
- 有序地图字符串搜索与整数搜索之间的时间复杂度
- 定义整数之间的特殊划分
- 如何修复C++中的"指针和整数之间的比较"错误?
- 如何计算两个负整数 c++ 之间的总和
- 直接为浮点变量分配十六进制整数与通过指针转换分配之间的区别
- 分段故障在类之间返回整数
- 字符串和整数之间的模板冲突
- 在给定的整数数组中,可以找到在给定位置之间分类数组的整数之和
- 如何处理平台之间整数的本地大小变化