2017-04-13 37 views
0

我將消息結構的內容編碼到緩衝區中。處理空字符串輸入導致分段錯誤

int encode(const struct message *msg, unsigned char *buffer, size_t max_size) 
{ 
    if (buffer == NULL) 
    return -1; 

    unsigned char *buf_pos = buffer; 
    unsigned char *ep = buffer + max_size; 

    if (buf_pos + 1 <= ep) { 
    *buf_pos++ = SYNC_WORD_1; 
    } else { 
    return buf_pos - buffer; 
    } 
    . 
    . 
    . 
} 

當我打電話encode(&message, "", 1024);我遇到分段錯誤預期。我的理解是,段錯誤是由嘗試訪問未分配給程序的內存引起的,因爲""將只包含空終止符,並且我將它傳遞給指針。

我遇到的問題是當我嘗試處理這個錯誤。我還沒有找到一種方法來識別無效輸入,該輸入不會導致有效輸入或其他段錯誤的誤報。

那麼,清除這種輸入的正確方法是什麼?

+1

'strlen(buffer)== 0' –

+3

一般來說,沒有辦法解決知道有多少內存以及它是否可寫的問題,它們存在於某個內存位置。 –

+2

'當我調用encode(&message,「」,1024); '第二個參數是一個字符串常量,不能被寫入。你的'* buf_pos ++ = SYNC_WORD_1;'試圖寫入它。 – joop

回答

2

這是無法完成的。

你基本上是問「給一個指針,我怎麼能確保有n個可寫空間呢?」這是C不能幫助你的問題。

這是根源,因爲指針只是地址,所以在與每個指針值關聯後,沒有其他元信息。

您可以檢查指針是否爲NULL,但基本上,您可以確定的唯一指針值是無效的。不可移植的(特別是在嵌入式目標上),您可以更加聰明地檢查指針是否位於各種已知的不可寫區域,但這仍然非常粗糙。

+0

問題是如何避免seg故障事件。這不是對這個問題的回答。 – user3629249

0

我想你在buf_pos 中複製它時沒有檢查緩衝區的大小當試圖訪問buf_pos + 1時,你可能會進入一些你沒有訪問權限的內存,導致分段錯誤。 你試過在你的可執行文件上使用valgrind嗎?

0

當問這個問題是關於運行時問題的時候,發佈實際輸入,期望輸出,實際輸出,最重要的是,乾淨編譯的後期代碼代碼很短,並且仍然存在問題。

以下代碼將處理指向僅包含NUL字節的字符串的指針。

但是,這不是唯一的問題。如果傳入的緩衝區指針可能指向只讀存儲器中的char數組,則發佈的代碼仍然會導致seg故障事件。

int encode(const struct message *msg, unsigned char *buffer, size_t max_size) 
{ 
    if (buffer == NULL) 
     return -1; 

    if(strlen(buffer) == 0) 
     return -1; 

    unsigned char *buf_pos = buffer; 
    unsigned char *ep = buffer + max_size; 

    if (buf_pos + 1 <= ep) 
    { 
     *buf_pos++ = SYNC_WORD_1; 
    } 

    else 
    { 
     return buf_pos - buffer; 
    } 
    . 
    . 
    . 
} 

爲了能夠更好地幫助您,您需要發佈調用此函數的場景。