2013-10-14 46 views
0

以負整數值運行下面的代碼時出現分段錯誤。我難以理解如何解決這種情況發生的原因。將負整數轉化爲二進制時出現分割錯誤

此方法的目標是將簽名轉換爲二進制字符串表示形式。此功能爲正數,但在負數出現segfaults

函數調用:

int_to_binary(-1, "00000000000000000000000000000000\0"); 

源:

#include <stdlib.h> 
#include <string.h> 

#define BUFFER_SIZE 33 

int int_to_binary(int input, char* output) 
{ 
    output += BUFFER_SIZE - 1; 

    while(input) 
    { 
    --output; 

    if(input & 1) 
    { 
     (*output)++; 
    } 

    input >>= 1; 
    } 

    return 0; 
} 

我只是遞減指針時,int是不等於0,這會意味着還有值得轉化。任何有關如何在Linux中進行調試的幫助將不勝感激。

+0

明顯的建議是要安裝並啓動[DDD](http://www.gnu.org/software/ddd/) – damienfrancois

回答

1

您可能會遇到無限循環,因爲input >>= 1從負數(算術移位)左移一位。這會導致您超出output緩衝區。

爲了確保這種情況,您可以逐步調試調試器中的循環,並檢查input如何通過移位進行更改。

0

試着在你的函數開始

+1

[此參考資料](https://www.securecoding.cert.org/confluence/display/seccode/INT34-C.+Do+not+shift+a+negative+number+of+bits+or+more+bits+比+ +存在+ + + +操作數)也可能有所幫助。 – damienfrancois

1

你改變指針值(--output)指向一些其他定義的非良好的內存位置,然後嘗試在這個內存更改值鑄造inputunsigned int位置((*output)++)導致段錯誤。

3

此代碼是喊段錯誤。

你的緩衝區甚至不是一個緩衝區,它是一個硬編碼的,應該是隻讀字符串,你甚至沒有來自調用者的指針引用。你不應該寫信給它。

而當你轉移一個有符號數時,它不是一個真正的二進制轉換。 input永遠不會停止爲-1

你需要做的正確轉移它是什麼:

input = (unsigned int)input >> 1; 
+0

重點重點:強調:**您不允許修改字符串文字!您必須將它們視爲只讀!** –

相關問題