0

我有一个这样定义的类:

#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 替换断言可以解决问题。

4

2 回答 2

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(除非真的有必要,这种情况很少见,而且只在模板中使用)会让你看起来毫无头绪。

于 2012-08-31T14:13:32.610 回答
1

这是相当古老的一个,但我想在上面发布我的发现:

用 size_t 替换 int 可以修复它,因为 int 可以 < 0,因此您理所当然地得到了分析错误。

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

静态分析不考虑断言,这就是 if 有效但 assert 无效的原因。如果你想抑制警告,你可以添加:

_analysis_assume(i>0 && i < MY_MAX_VALUE)

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

于 2014-03-17T10:57:11.813 回答