2

好的,我很确定这只是由于 Visual Studio 中经常出现错误的静态代码分析器,但我认为更多的关注这不会有什么坏处。

我已经编写了自己的矢量风格容器集合。它们似乎工作正常,但我注意到来自 Visual Studio 静态代码分析器的以下警告:

警告 C6386:缓冲区溢出:访问“参数 1”,可写大小为“newspace*4”字节,但可能会写入“4194240”字节

上述警告出现在以下代码(memcpy)的最后一行,并突出显示所有前面的行。这个特定的向量类可以拥有的所有可能的类型都是 POD。 mSpace包含向量中可用内存可以容纳的项目数, mSize包含当前项目数。 mDynamic指向当前由向量管理的内存块。

Bool Insert( UInt32 index, TYPE value, UInt32 count = 1 )
{
    if( index < mSize )
    {
        UInt32  newsize = mSize + count;

        if( newsize > mSpace )
        {
            UInt32  newspace = std::max( Align( newsize, 8 ), mSpace << 1 );
            TYPE*   ptr = new TYPE[ newspace ];

            if( ptr )
            {
                memcpy( ptr, mDynamic, index * sizeof( TYPE ));
                // The remainder of the code copies the second half of the
                // existing data and inserts the new values...

我一直看着这个,直到我的眼睛流血(好吧,几乎)并且看不出分析仪为什么会产生这个警告。我在其他地方也看到了同样的警告,它的值也相当奇怪,4194240,这就是为什么我假设它是分析器中的另一个错误。

谁能确认这是分析器中的一个已知错误(对连接的快速搜索没有提供任何结果),或者我的代码中是否有一个我没有看到的明显错误?

4

1 回答 1

0

不确定它是否与警告有关,但您确实有一个错误。如果 mSize 为 2^32 - 1,则由于整数溢出,newsize 将设置为 0,最终导致缓冲区溢出。如果您index * sizeof( TYPE )不检查结果是否适合 32 位,则会出现类似的错误。

更小,但你真的应该使用size_t而不是UInt32,否则如果你想编译为 64 位,你会收到关于类型不匹配大小的警告 memcpy 将 size_t 作为第三个参数,并且 size_t 在 64 位 Windows 上是 64 位.

于 2012-02-23T20:43:51.013 回答