簡體   English   中英

通過取消引用將字符串與 uint32_t 進行比較

[英]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 語句重復調用strcmpstrncmp等字符串解析函數來減少計算。

……將字符串的內存地址指針類型轉換為 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 語句重復調用strcmpstrncmp等字符串解析函數來減少計算。

避免使用雜物。 編寫清晰的代碼並讓編譯器進行優化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM