首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VS2010静态代码分析缺陷?

VS2010静态代码分析缺陷?
EN

Stack Overflow用户
提问于 2012-02-19 13:41:08
回答 1查看 403关注 0票数 2

好吧,我很确定这只是Visual中的一个总是错误的静态代码分析器,但是我发现有更多的人关注这个问题不会有什么影响。

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

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

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

代码语言:javascript
复制
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,这就是为什么我认为它是分析器中的另一个错误。

有人能确认这是分析器中已知的错误(快速搜索connect没有提供任何结果),还是我的代码中有一个明显的错误,我只是没有看到呢?

EN

回答 1

Stack Overflow用户

发布于 2012-02-23 20:43:51

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

更重要的是,您应该使用size_t而不是UInt32,否则如果您想编译到64位,就会对不匹配大小memcpy的类型发出警告,使用size_t作为第三个参数,而size_t在64位Windows上是64位。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9349673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档