所以在這裏我相信我在查看別人的代碼時發現了一個小緩衝區溢出問題。它立即使我感到不正確,並且有潛在的危險,但我承認我無法解釋這個「錯誤」的實際後果,如果有的話。這個緩衝區溢出的後果?
我寫了一個測試應用程序來演示錯誤,但發現(令我沮喪),它似乎無論溢出都正確運行。我想相信這只是偶然,但需要一些反饋來確定我的想法是否錯誤,或者如果真的存在問題,那麼在我的測試應用程序中就不會顯示它的頭。
問題代碼(我覺得是,反正):現在
char* buffer = new char[strlen("This string is 27 char long" + 1)];
sprintf(buffer, "This string is 27 char long");
,之所以這樣站出來給我,我想將其標記爲可能的緩衝區溢出是因爲第一strlen
的。由於指針算術,+ 1
的'錯誤'放置將導致strlen
返回26
而不是27
(以「他的字符串是27個字符長」)的長度。我相信,sprintf
,然後打印27個字符到緩衝區並導致緩衝區溢出。
這是一個正確的評估?
我編寫了一個測試應用程序來爲我正在查看的代碼演示這個人,並發現即使在調試器中字符串也能正確打印。我還試圖在堆棧之前和之後放置其他變量,以查看是否可以影響相鄰區域的內存,但仍然接收到正確的輸出。我意識到我新分配的堆內存可能不會相鄰,這可以解釋缺乏有用的溢出,但我真的很想確認他人的意見,如果這實際上是一個問題。
由於這是一個非常簡單的「問題」,如果您也可以用某種參考來支持您的答案,那將會很好。雖然我非常重視並歡迎您的意見,但我不會接受「是的」作爲最終答案。提前謝謝你。
更新:許多很好的答案有很多額外的洞察力。不幸的是,我無法接受他們。感謝您分享您的知識併成爲我的「第二意見」。我很感激幫助。
由於填充/對齊,您可能不會被上面的代碼咬傷。你可以用64字符長的字符串重複你的實驗,所以分配需要65個字符嗎?在'sprintf'之前分配兩個這樣的字符串,以不同的順序填充它們。 – 2010-07-20 14:21:50
這是非常討厭的代碼,需要一個原始字符串,併爲其添加+1!我會僅僅根據這個事實對代碼進行審查。 – 2010-07-20 14:24:58
這就是爲什麼我們的開發人員使用盡可能多的經過充分測試的庫,因爲我們犯這樣的愚蠢錯誤! :-) @Johnson我非常肯定開發者打算把長度加1,而不是字符串本身,因此這個bug。 – corsiKa 2010-07-20 14:25:55