嚴格的別名讓我偏執。有時我用* int指針設置值,並且期望目標內存讀取相同的數據,而不管讀指針類型是什麼。嚴格的別名不能保證這一點,有時甚至會導致這種情況並非如此。memcpy別名int到char產生UB?
如果我在循環中讀取char [],並且在該char []數組中有一個* int chainging東西,我打破了其他標準C事物之間的別名規則。
我正在製作一個JIT編譯器,因爲我使用的是x86,所以我確信我不必關心int對齊。直到我們解決了別名問題之前,讓我們保持這一點。
考慮這個片段:
unsigned char x86[] = {0x11, 0x44, 0x42, ... };
uint32_t *specific_imm = (x86+10);
現在,* specific_imm = 42;在x86平臺上仍然是UB,因爲允許編譯器假定* specific_imm不會與x86 []混疊。通過做出這樣的假設,它不需要立即設置這些字節,而是可以進行各種優化。將x86 []和* specific_imm設置爲volatile將解決我的問題,但這不夠好,因爲我想正確學習C.
我們已經解決了現在的別名問題。有人建議這個解決方案: memcpy(x86 + 10,specific_imm,4);
但是C標準似乎也有關於別名指針的問題(如果我正確地理解了事情),如以下代碼所示。
/* naive implementation of memcpy */
inline void _memcpy(unsigned char *a, unsigned char *b){
*a = *b;
}
int main(void) {
long i = 0xFFFFFFFF;
unsigned char c = 1;
++i;
_memcpy(&c,&i);
return c;
}
由於編譯器是免費的假設,「我」是不是在這種情況下,(?)影響到C不知何故,主要是免費進行優化,以剛剛返回1?
我更喜歡在解決問題之前解決問題。
在此先感謝
我建議你修復你的例子,你可能在答案中看到了我的評論:我的價值並不明顯。 – 2501