C++ VS2010代码分析奇怪的数组限制错误

C++ VS2010代码分析奇怪的数组限制错误,c++,arrays,visual-studio-2010,code-analysis,C++,Arrays,Visual Studio 2010,Code Analysis,我有一个这样定义的类: #include <cassert> class Vector { double v[2]; double operator()(int i) const { assert(i>=0 && i<2); return this->v[i]; } }; 但它对我来说似乎完全有效,因为断言应该防止任何负值。发生了什么事 编辑:代码分析似乎无法正确处理

我有一个这样定义的类:

#include <cassert>

class Vector
{
     double v[2];

     double operator()(int i) const
     {
         assert(i>=0 && i<2);
         return this->v[i];
     }
};
但它对我来说似乎完全有效,因为断言应该防止任何负值。发生了什么事


编辑:代码分析似乎无法正确处理断言:

assert(i<2)

产生

warning C6385: Invalid data: accessing 'this->v', the readable size is '16' bytes, but '24' bytes might be read
warning C6385: Invalid data: accessing 'this->v', the readable size is '16' bytes, but '-16' bytes might be read

用ifs替换断言可以解决问题。

分析器在查看
返回此->v[i]时,可能没有考虑
断言

要解决此问题,请使用类型而不是断言强制执行正索引:

class Vector { 
    double v[2];
public:
    double operator()(size_t i) const { 
        assert(i<2);
        return v[i];
    }
};
类向量{
双v[2];
公众:
双运算符()

断言(iwhatever
(除了真正必要的时候,这是罕见的,而且只在模板中出现)会让你看起来不知所措。

这是一个很老的断言,但我想在上面发布我的发现:

将int替换为size\u t可以修复它,因为int可以<0,因此正确地得到分析错误

要修复它,请将其更改为size\u t或unsigned int

静态分析不考虑断言,这就是为什么if有效,但断言无效。如果您想超过警告,可以添加:

\u分析\u假设(i>0&&i


这将告诉分析器i的期望值。

如果您没有使用
assert
而使用
if
-语句,会发生什么情况?丹:它工作正常。这是否意味着工具只是错误地处理assert()?如果您同时对静态分析工具感兴趣,请尝试使用PVS-Studio。即使更改为size\u t,断言似乎也没有得到正确考虑:有关断言(i
warning C6385: Invalid data: accessing 'this->v', the readable size is '16' bytes, but '-16' bytes might be read
class Vector { 
    double v[2];
public:
    double operator()(size_t i) const { 
        assert(i<2);
        return v[i];
    }
};