我有一个像这样定义的类:
#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替换断言可以解决问题。
答案 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对于哪些值。