[英]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.