[英]Compare string with uint32_t by dereference
比如說我想解析來自用戶/標准輸入的輸入,這個輸入是一個字符串( char*
/ char []
)。 我知道我可以將字符串的內存地址指針類型轉換為uint32_t
指針並取消引用所述uint32_t
指針以提取一個unsigned int
值,該值在大多數體系結構中都是相同的(我已經測試過)。 這安全嗎? 它會導致錯誤/未定義的行為嗎? 即一般來說是個壞主意?
例子:
#include <stdio.h>
#include <stdint.h>
int main(void) {
char data[] = "status";
printf("%u\n", *(uint32_t*)data);
return 0;
}
將導致1952543859
在 64 位和 32 位(windows 和 linux,未在 MAC/unix 系統上測試)
進行以下操作是否安全?:
char str_from_input[] = "status";
if (*(uint32_t*)str_from_input == 1952543859)
//... execute some code oriented around "status".
我的明顯目標是通過不通過直接uint32_t
check/if 語句重復調用strcmp
和strncmp
等字符串解析函數來減少計算。
……將字符串的內存地址指針類型轉換為 uint32_t 指針……這樣安全嗎?
否。如果uint32_t
的字符串未正確對齊,則未定義uint32_t
的行為,根據 C 2018 6.3.2.3 7:“......如果結果指針未正確對齊引用類型,則行為未定義...... ”
取消引用結果指針會使用不適合它的類型訪問字符串,違反了 6.5 7 中的別名規則,並且 C 標准沒有定義該行為。
它會導致錯誤/未定義的行為嗎?
是的。
即一般來說是個壞主意?
是的。
進行以下操作是否安全?:
不。
要將字符串中的字節重新解釋為uint32_t
,請使用:
uint32_t t;
memcpy(&t, string, sizeof t);
printf("%" PRIu32 "\n", t);
( memcpy
在<string.h>
中聲明, PRIu32
在<inttypes.h>
聲明。)
要將uint32_t
的字節復制到字符串中,請使用memcpy(string, &t, sizeof t);
.
如果可行,一個好的 C 編譯器很可能會用直接數據移動指令替換memcpy
調用。
我的明顯目標是通過不通過直接
uint32_t
check/if 語句重復調用strcmp
和strncmp
等字符串解析函數來減少計算。
避免使用雜物。 編寫清晰的代碼並讓編譯器進行優化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.