我有一个简单的虚拟机,我为了好玩而制作。它工作在一个非常低的水平,它没有任何类型的概念。一切都只是一个整数。有一些指令用于获取指针和通过指针访问内存。问题是这些指针只是存储为uint64_t
,任何指针算术都是整数运算。当使用它作为指针时,机器将其转换为void*
。嗯,这种代码在汇编级别很明显,但C和C ++标准不允许程序员安全地执行整型指针转换,尤其是当整数用于更改指针的值时。
我不是把这个玩具VM随处携带。它只能在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);
以上不是真正的代码,但是某个字节码指令序列实际上会做与上面类似的事情。
答案 0 :(得分:2)
如果你真的需要来投射一个整数的指针,至少使用uintptr_t
,为意大利面条怪物的缘故!此类型(及其已签名的对应项)表示可安全地转换为指针/从指针转换。但是,它不能用于操作(但对于线性模型可能是安全的,不会修改两个值的表示)。
然而,您的代码似乎没有意义,但可能会阻碍编译器积极优化。如果没有更深入的了解你打算完成什么,我会说,有可能有更好的方法。