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

时间:2012-08-31 14:03:59

标签: 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];
     }
};

运行VS2010代码分析工具时,会在阵列访问时抛出警告:

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

但对我来说似乎完全有效,因为断言应该可以防止任何负面价值。发生了什么事?


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

assert(i<2)

产生

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

,而

assert(i>=0)

产生

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

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

2 个答案:

答案 0 :(得分:1)

分析器在查看assert时可能没有考虑return this->v[i];

要修复它,请使用类型而不是断言来强制执行正索引:

class Vector { 
    double v[2];
public:
    double operator()(size_t i) const { 
        assert(i<2);
        return v[i];
    }
};

顺便说一句,使用this->whatever(除非真正有必要,但罕见且仅在模板中使用)会让你看起来毫无头绪。

答案 1 :(得分:1)

这是一个很旧的,但我想发表我的发现:

用size_t替换int会修复它,因为int可以是&lt; 0,所以你理所当然地得到分析错误。

要修复它,请将其更改为size_t或unsigned int。

静态分析不考虑断言,这就是为什么if有效,但断言却没有。如果你想要压制你可以添加的警告:

_analysis_assume(i>0 && i < MY_MAX_VALUE)

这将告诉分析仪i对于哪些值。