簡體   English   中英

測試輸入的緩沖區溢出

[英]Testing buffer overrun of input

例如,如果我輸入的字符大於10,為什么不拋出異常或錯誤? 您會用getline獲得輸入嗎?

int main()
{
    char c[10];

    while (cin >> c)
    {
        cout << c << endl;
    }
}

為什么不引發異常或錯誤?

緩沖區溢出是未定義行為的一個示例。 該行為實際上是未定義的:如果您溢出緩沖區,則無法保證程序將執行的操作。 這不會產生異常,因為這樣做將需要大量相對昂貴的檢查,即使使用正確的代碼也是如此,並且在C ++中,總的哲學是您不必為不需要的東西付錢。

如果避免使用原始數組和原始(非智能)指針,並使用C ++標准庫容器,字符串和算法,則可以輕松避免大多數情況導致緩沖區溢出。

您會使用getline來獲取輸入嗎?

您可以使用std::getline ,它允許您將字符的“一行”提取到std::string ,也可以使用>>並直接將其提取到std::string對象中,具體取決於什么,您要提取。

有些工具試圖揭示這些問題。 valgrind和GuardMalloc就是這樣的例子。 同樣,msc允許您指定可能暴露此類問題的生成選項。

還要注意,不同的編譯器會根據您的程序發出不同的指令,而在優化與否時會發出不同的指令。 這意味着后果可能存在於某些版本中,而可能不存在於其他版本中。

我偶爾會使用我提到的工具/技術來測試我的程序。 我還在單元測試中使用了更多的動態分配,以便在使用這些工具運行程序時更輕松地發現失敗的情況。

如果您來自Java或集成了更智能數組的另一種語言,那不是編譯器解釋c程序的方式,也不是它們在內存中的表示方式。 相反,我們通常在c ++中使用適當的容器。 這些將檢測許多這些問題。 例如,如果您嘗試訪問無效的元素,則可能會拋出std::vector

祝好運

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM