【问题标题】:VS2010 Static Code Analysis Bug?VS2010静态代码分析Bug?
【发布时间】:2012-02-19 13:41:08
【问题描述】:

好的,我很确定这只是因为 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,这就是为什么我假设它是分析器中的另一个错误。

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

【问题讨论】:

  • 4194240 是 2^22 - 2^6。不确定这是否相关......
  • 对我来说看起来像是一个非常虚假的警告......该警告是否仅在您使用某种类型实例化它时出现?比如,如果你将你的类隔离在一个没有客户的项目中,它会出现吗?
  • 也许尝试通过另一个tool运行你的代码...
  • 不,它出现在许多不同的类型上。我尝试了其他几种不同的静态代码分析工具,但没有一个提到有关此代码的任何内容 - 另一个表明它是 VS2010 错误的指标。我还看到完全不相关的代码段出现警告 - 再次使用神奇的 4194240 值,所以我几乎把它写成不是我的问题。

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


【解决方案1】:

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

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

【讨论】:

  • 实际上,早在 mSize 达到 2^32-1 之前,我就会遇到溢出错误。 (可能大约在 mSize * sizeof( TYPE ) 达到 2^32 的时候。)到那时我会遇到很多其他问题,例如没有任何内存可供代码使用。 ;) 实际上,在 Windows XP 上,在进程启动后立即分配大于约 700MB 的单块内存非常困难。这个数字在 Vista/7 上有所增加,但仍远未接近 32 位地址空间限制。
  • 至于 64 位,自从 Microsoft 提供第一个 64 位编译器以来,我一直在 Win64 上进行构建。我尽可能避免使用 size_t 。我不得不从其他人那里修复太多错误,他们将 size_t 与 int 混合在一起,产生了有趣的后果(主要是从预期文件和网络连接到神奇地仍然可以在不同的体系结构中工作)。再加上 64 位类型无缘无故地使内存需求翻倍的事实(我在这里不需要 64 位大小)以及 64 位指令在 AMD64 上的前缀这一事实也增加了不必要的代码大小。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-04
  • 2023-03-25
  • 2018-04-01
  • 1970-01-01
  • 2020-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多