long keyIntValue;
uint8_t *value;
*(long *)value = keyIntValue;
我在執行linting時得到可疑的指針到指針的轉換(區域太小)。 幫我理解我爲什麼得到它以及如何擺脫它?警告:使用lint可疑的指針到指針轉換(區域太小)
long keyIntValue;
uint8_t *value;
*(long *)value = keyIntValue;
我在執行linting時得到可疑的指針到指針的轉換(區域太小)。 幫我理解我爲什麼得到它以及如何擺脫它?警告:使用lint可疑的指針到指針轉換(區域太小)
首先,我們的代碼展示了undefined behaviour,因爲您解引用單位化指針value
。
也就是說,uint8_t
是太短來保存類型long
的值。你應該更好地知道你在做什麼。
經驗法則:不要試圖投指針,他們可以創建對齊問題。 (如果你必須)鑄造取代。
您正在將「指向uint8_t的指針」(uint8_t *
)投射到long *
。至於uint8_t,只有一個字節(假設是8位)可用,對現在的long *
的任何分配都會溢出到後面的字節(一個long
至少有32位= 4字節),因此不屬於指向的對象,因此創建未定義的行爲(UB)。
請注意,如圖所示,value
在分配時未定義,也表現爲UB。
你是對的,但沒有一個是指針轉換。 – Olaf
@Olaf,你指的是'指針指針轉換'的意思? –
這就是根據問題由皮棉報告的內容。對於指針到指針的轉換,它會要求一個指針比另一個指針要小(在這裏:接收指針)。對於某些嵌入式系統可能如此。但不適用於數據類型(應該會生成截斷警告/錯誤)。 uin8_t和long都不是指針。 – Olaf