簡體   English   中英

std :: array-'大小為n的緩沖區將被溢出',僅在VS中

[英]std::array - 'buffer of size n will be overrun', only in VS

constexpr auto CHUNKS_X = 5, CHUNKS_Y = 5, CHUNKS_Z = 1;
std::array<std::bitset<CHUNKS_X>, CHUNKS_Y> ys;
std::array<decltype(ys), CHUNKS_Z> zs;
if (CHUNKS_Z > 1)
{
    zs[0] = ys;
    //zs.at(1) = ys; //this works
    zs[1] = ys; //this doesn't work
    for (auto &x : zs[1])
    {
        x.flip();
    }
    for (auto z = 2; z < CHUNKS_Z; z++)
    {
        zs[z] = zs[z - 2];
    }
}

zs[1] = ys; 給我

error C4789: buffer 'zs' of size 20 bytes will be overrun; 20 bytes will be written starting at offset 20

但僅當在VS中編譯時。 在命令行上編譯不會給我這樣的錯誤,使用zs.at(1) = ys;也不會給我這樣的錯誤zs.at(1) = ys; 代替。 值得注意的另一件事是MSDN說這應該是警告,而不是錯誤。

我意識到這可能是一個微妙的編譯器標志問題,但是我沒有絲毫線索可以從哪里開始尋找。

Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23506 for x86
std::array<decltype(ys), CHUNKS_Z> zs;

相當於

std::array<decltype(ys), 1> zs;

表示zs是一個包含1個元素的數組;

數組通常是從零開始的,這意味着第一個元素位於zs[0] ,並且沒有其他元素,因此zs[1]要求數組將具有第二個元素,而在您的示例中則沒有。

因為您檢查if (CHUNKS_Z > 1)是否應該沒有問題,因為您無法到達zs[1] = ys; 而且不會有任何問題。

如果我將CHUNKS_Z更改為2 ,則在VS15中沒有任何錯誤

暫無
暫無

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

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