我試圖解除對unsigned char*指標的參考,但程式崩潰時出現了segfault,因為它的值總是0xffffffffffffffff。在取消參考指標之前,我想檢查它所指向的地址是否與0xffffffffffffff不同(以避免segfault)。我怎樣才能在不對0xffffffffffffff進行硬編碼檢查的情況下進行檢查呢? 即,
unsigned char* pointer。
...
//我寧愿使用適用于x86或x64機器的東西。
if( pointer & 0xffffffffffff >= 0xffffffffff - 1 ) {
//exit
}
我知道我應該修復我的應用程式,這樣指標就不會被設定到無效的地址0xffffffffffff,但是代碼庫相當大,而且很復雜,我還不確定如何重現這個問題。因此,在沒有弄清楚這個指標是如何被設定為無效地址的同時,我想設定一個保護。
只是出于空閑的好奇心,我怎樣才能有目的地使一個指向無符號char*的指標指向0xffffffffff(目標機上的最大地址)?我的程式在某個地方這樣做了,但我不知道如何做,因為我還在尋找罪魁禍首。
uj5u.com熱心網友回復:
將-1轉換為無符號字符*,在一個典型的編譯器上,將產生一個指標值0xffffffff或0xffffffffffff,分別在32位或64位系統上。
if (pointer == (unsigned char *)-1) {
log_msg("臭名昭著的0xffffffffbug已經出現了! 詳情如下...")。)
log_msg(/* 關于程式狀態的更多資訊 */)。
abort()。
其他的可能性包括if (pointer == (unsigned char *)UINTPTR_MAX)或者if ((uintptr_t)pointer == UINTPTR_MAX)。
UINTPTR_MAX似乎是指標所指向的整數的最大值
這是不對的。 它是無符號整數型別
uintptr_t的最大值,根據這個系統上指標的大小,它通常是一個32位或64位整數。 所以你可以通過把這個值投給一個指標,或者把指標投給uintptr_t,然后與UINTPTR_MAX比較,得到所需的指標。
給未來的讀者一個提示。這只適用于 OP 提到的特定情況:你已經確定了0xffffffff等是你試圖追蹤的某些特定 bug 所產生的值。 一般來說,我們不可能在運行時測驗一個給定的指標是否指向一個有效的物件;你必須設計你的程式,以便首先只使用有效指標。此外,當你談論一個不指向特定物件的指標(并且不是 NULL)時,你就超出了標準 C 的范疇,所以所有這些都是標準中未定義的行為(或者最多就是實作定義的行為)。 你依賴于你的特定編譯器的行為,但期望他們以 "自然 "的方式處理這種情況是合理的。
uj5u.com熱心網友回復:
請不要使用這個,請看評論參考:
sizeof(char *) * 8可能是32或64。那么1 << sizeof(char*) * 8就是1 << 32或1 << 64。1是一個int常數,它可能是32位。那么1 << 32和1 << 64并沒有被C標準所定義;寬度大于或等于左運算元寬度的移位(晉升后)沒有被定義。而且不需要這些;UINTPTR_MAX是OP要求的值(即使他們的方法不好),而且,如果這個值不可用,(uintptr_t)-1也是這個值。
我做了這個測驗程式,它似乎是有效的。https://ideone.com/bqgUrH
On if 1
在if 2上
1 0xffffffffff
2 0xfffffffffffd
它把char *的大小(在x86上通常是4位元組)乘以8來轉換為位元(32位元),然后,它移動1 << 32,并減去1使之成為0xffffffff...
#include <stdio.h>
int main(void) {
unsigned char *p = (1 < < sizeof(char*) * 8) - 1;
無符號 char *p2 = (1 < < sizeof(char*) * 8) - 3;
if ( ((unsigned int)p & ((1 << sizeof(char*) * 8) - 1)) >=((1 << sizeof(char*) * 8) - 2) )
{
printf("On if 1
")。)
}
if (! (((unsigned int)p2 & ((1 < < sizeof(char*) * 8) - 1)) >=((1 << sizeof(char*) * 8) - 2)))
{
printf("On if 2
")。)
}
printf("1 %p
", p)。)
printf("2 %p
", p2)。)
return 0。
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/315437.html
標籤:
上一篇:一個變數可能持有的數值

