2015-09-05 33 views
0

這是我一直試圖解決的調試問題。我知道我需要申請的位掩碼b等於a。我使用gdb檢查了ab之間的差異。變量bachar[]類型,並在達到'錯誤'之前設置。指向變量的指針在取消引用時不更新變量

#include <string.h> 

int main() { 
    char a[1] = "a"; 
    char b[1] = "b"; 
    int *x; 
    x = (int *) b; 
    // bug in next line 
    *x = *x & 0xffffffff; 
    return memcmp(a, b, 1); 
} 

直到a等於b,我解決不了這個問題。給出的唯一約束是該錯誤位於標註的行中,不會更改其他代碼。沒有規則說我不能在bug之後添加行,但在memcmp()之前。我發現的問題是,我對位掩碼做的任何操作都不會改變b的值。我已經設置了斷點並檢查了錯誤前後x*x的值,但x似乎沒有改變。

Breakpoint 1, main() at test.c:9 
9  *x = *x & 0xffffffff; 
(gdb) print (int) a 
$1 = -6922 
(gdb) print (int) b 
$2 = -6921 
(gdb) print (int) x 
$3 = -6921 
(gdb) step 

Breakpoint 2, main() at test.c:10 
10 return memcmp(a, b, 1); 
(gdb) print (int) a 
$4 = -6922 
(gdb) print (int) b 
$5 = -6921 
(gdb) print (int) x 
$6 = -6921 

我不明白如何通過修改錯誤所在行的常量來按要求的方式解決此問題。任何幫助瞭解如何使用x更新b使用按位掩碼將不勝感激。

+0

正如你所做的標籤C++:不要使用C風格的轉換。在這種情況下,你必須使用'reinterpret_cast'來編譯它。無論何時您使用該關鍵字並且不確定知道爲什麼它是安全的,該代碼應該被認爲是錯誤的! –

+0

我不相信你的編輯。調試器的輸出與代碼不一致。 –

+0

是正確的,這是一個例子,我轉換成了一個最小的完整示例。所以顯示的整數值不代表「a」和「b」的實際值等。 –

回答

1

您正在嘗試改變b的地址,但在

*x = *x & 0xffffffff; 

,因爲你提領x你正在改變的價值。 Yyou需要操縱適用於x自己喜歡

x = x & 0xffffffff; 

然後你需要重新分配X到b中。

這將與strict aliasing rules發生衝突。

+0

@mike_b我更新了我的答案。 – NathanOliver

+0

「超出範圍」是什麼意思?這是你的程序..改變任何你想要的。 (如果這是家庭作業,請檢查學校的學術誠信政策,當您提交作業時,您可能需要引用此網站,並且我懷疑「在互聯網上發佈問題並複製答案」將被視爲非常有利) –

+0

你認爲我的意思是「超出範圍」?你認爲我的意思是說「調試問題」或指出「錯誤」在哪一行?這是一個問題(不是家庭作業,但與學校有關)給我解決的指示,我只需要改變位掩碼來解決它。因此,我說「我知道我需要應用的位掩碼使b等於」。我在SO上的問題讓我懷疑實際上有一個解決方案,因爲'* x'在修改時與'b'無關。但在向博士宣稱他們的指針邏輯錯誤之前,最好問一下。 –

1

x是一個指針;將它投射到一個int只是給你一個十進制數的地址。

ab都是數組,它們會在您執行需要指針的操作時衰減爲指針。通過將它們投射到int,您將再次獲得變量的地址。即使該地址處的內容發生更改,該地址也不會因您正在執行的操作而發生變化。

由於ab都小於int,因此您的代碼很可能會以非常痛苦的方式混淆。即使它們尺寸合適,也不保證做正確的事情。