VS2010静态代码分析错误?

时间:2012-02-19 13:41:08

标签: c++ visual-studio-2010 static-code-analysis

好吧,我很确定这只是在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的相当奇怪的值,这就是为什么我假设它是分析仪中的另一个错误。

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

1 个答案:

答案 0 :(得分:0)

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

更小,但你真的应该使用size_t而不是UInt32,否则如果你想编译成64位,你会发出关于不匹配大小的类型的警告memcpy需要一个size_t作为第三个参数,64位Windows上的size_t为64位。