2016-12-08 65 views
-2
void updateConfigParams(void) { 
    char buffer [512]; 
    int i = 0; 

while ((c = readFromWireless()) != NULL) 
{ 
    buffer [ i ] = c; 
    i += 1; 
} 
writeConfigParams (buffer); 
} 

我只是在處理緩衝區溢出問題,所以請有人告訴我如何更改下面的代碼以防止緩衝區溢出,並解釋新代碼如何停止寫入緩衝區末尾。如何調整以下代碼以防止緩衝區溢出?

+2

你瞭解緩衝區溢出嗎?如果是的話,那麼它相當微不足道。 – bashrc

+0

@bashrc這就是我努力去理解它的問題。 – HHEX

+1

難道你只是確保它不會超過你的512尺寸? –

回答

-1
void updateConfigParams(void) { 
    char buffer [512]; 
    int i = 0; 

    while (i < 512 && (c = readFromWireless()) != NULL) { 
     buffer [ i++ ] = c; 
    } 
    writeConfigParams (buffer); 
} 
+2

'writeConfigParams()'如何知道要寫多少緩衝區? – chux

0

您可以添加以下if語句來檢查緩衝區溢出條件。增加變量後我

i+=1; 
if(i > 512) 
    break; 

一旦我達到緩衝區限制,你將退出循環。

2

如果(i == sizeof(buffer)) break,則需要在while循環的開始處添加緩衝區大小檢查 ;

,並在緩衝區的末尾添加\ 0,如果writeConfigParams需要一個字符串

0

Buffer overflow是當你嘗試寫超出分配給緩衝區的內存地址。

在你的情況下,你已經分配了512字節,所以你的代碼應該確保你永遠不會脫離buffer + 511之外的參考。換句話說

buffer [i] // i should never exceed 511

你的代碼應該檢查是否停止服用一次輸入你的索引計數器達到等於緩衝區的大小。

+0

OP的問題是如何做到這一點,所以你沒有回答這個問題。 –

+0

@CareyGregory 「如果您的索引計數器達到等於緩衝區大小時,您的代碼應該有檢查以停止輸入。」 另請參閱OP對我評論的回覆。 >>你瞭解緩衝區溢出嗎? >> @ bashrc這就是我努力去理解它的問題。 – bashrc

-1

我會做一些大意如下:

bool 
updateConfigParams(void) { 
    char buffer[512] = {}; 
    int i = 0; 

    while((c = readFromWireless()) != NULL) { 
    if(i == sizeof(buffer) - 1) { 
     warn("readFromWireless exceeded %zu byte limit", sizeof(buffer)); 
     return false; 
    } 
    buffer[i++] = c; 
    } 
    writeConfigParams(buffer); 
    return true; 
} 

根據你的程序的狀態,它可能更適合簡單地調用ERR(3)。重要的一點是:

  • 當寫入數組時,總是確保你在進入界限。
  • 將輸入收集到數組中時,始終要爲超出陣列大小的輸入做好準備。如何處理您無法接受的輸入取決於應用程序。
  • 當程序員在編譯時無法阻止內部存儲 - 例如無線設備發送「太多」數據 - 通知用戶該程序。上面,程序發出一條消息,該函數返回一個錯誤狀態。
  • 部分輸入通常是可疑的,不應被接受。

編輯:根據評論,我添加了初始化到buffer。由於writeConfigParams不接受長度參數,因此可能接受NUL終止的字符串。

+1

'writeConfigParams()'如何知道'buffer'要寫多少? – chux

+0

什麼是'c'?你只是依靠它違約'int'? –

+0

@CareyGregory,我不知道'c'是什麼。它當然不會對任何事物「默認」。我沒有'writeConfigParams'聲明,依此類推。這是他的代碼,它不能編譯。他沒有要求編譯它;他問如何處理緩衝區溢出。這是我回答的問題。如果我的答案會被低估,我一定會想知道它是如何回答問題的。 –