簡體   English   中英

使用動態分配的 arrays 導致來自代碼分析的 C6386 緩沖區溢出警告

[英]Using dynamically-allocated arrays causes C6386 Buffer Overrun warning from Code Analysis

當我在 C++ 中使用動態分配的數組時,我收到了 Visual Studio 2019 代碼分析發出的C6386 警告

這是一個最小的可重現示例:

#include <vector>

int main()
{
    std::vector<int> someInts{ 1, 2, 3 };

    int* dynamicInts = new int[someInts.size()];

    for (size_t i = 0; i < someInts.size(); i++)
    {
        dynamicInts[i] = someInts[i];
    }

    delete[] dynamicInts;
}

這里的意圖是我們有一個整數向量,出於某種原因,我們希望將它們復制到一個動態分配的整數數組中。 (有點愚蠢的例子,但它說明了問題)。 它在分配dynamicInts數組期間使用向量的size()並作為循環的上限,因此我可以看到緩沖區溢出應該沒有問題。

但是這段代碼會生成:

main.cpp(11): warning C6386: Buffer overrun while writing to 'dynamicInts':  the writable size is 'someInts.public: unsigned int __thiscall std::vector<int,class std::allocator<int> >::size(void)const ()*4' bytes, but '8' bytes might be written.

錯誤列表中的詳細解釋將其解釋為:

7: 'dynamicInts' is an array of 1 elements (4 bytes)
9: Enter this loop. (assume 'i<someInts.size()')
9: 'i' may equal 1
9: Continue this loop. (assume 'i<someInts.size()')
11: 'i' is an In/Out argument to 'std::vector<int,std::allocator<int> >::[]'
11: Invalid to write to 'dynamicInts[1]'. (writable range is 0 to 0)

這些消息表明分析器認為dynamicsInts數組只是一個元素。

這似乎很奇怪。 我知道“代碼分析很困難”,但分析器肯定有它需要的所有信息來推導數組長度和循環邊界嗎?

那么這只是代碼分析的誤報嗎? 還是我錯過了什么?

如果它是假陰性,那么在不添加抑制並假設我們需要堅持動態分配的 arrays 的情況下避免此警告的最佳方法是什么?

有趣的是,我可以通過為數組的大小引入一個無意義的中間變量來消除警告 go,如下所示:

#include <vector>

int main()
{
    std::vector<int> someInts{ 1, 2, 3 };
    size_t numberOfInts = someInts.size();

    int* dynamicInts = new int[numberOfInts];

    for (size_t i = 0; i < numberOfInts; i++)
    {
        dynamicInts[i] = someInts[i];
    }

    delete[] dynamicInts;
}

我不知道為什么代碼分析器喜歡這個,但不喜歡原始代碼。

如果我使用智能指針來保存動態分配,分析器也很高興,這有點整潔,可能一開始就應該這樣寫。

#include <vector>
#include <memory>

int main()
{
    std::vector<int> someInts{ 1, 2, 3 };

    std::unique_ptr<int[]> dynamicInts(new int[someInts.size()]);

    for (size_t i = 0; i < someInts.size(); i++)
    {
        dynamicInts[i] = someInts[i];
    }
}

暫無
暫無

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

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