好吧,我很确定这只是Visual中的一个总是错误的静态代码分析器,但是我发现有更多的人关注这个问题不会有什么影响。
我写了我自己的矢量风格容器的集合。它们似乎工作正常,但我注意到Visual静态代码分析器发出的以下警告:
警告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没有提供任何结果),还是我的代码中有一个明显的错误,我只是没有看到呢?
发布于 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位。
https://stackoverflow.com/questions/9349673
复制相似问题