次のように定義されたクラスがあります。
#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
assert を ifs に置き換えると、問題が解決します。