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

assert を ifs に置き換えると、問題が解決します。

4

2 に答える 2

1

これはかなり古いものですが、私の調査結果を投稿したかったのです。

int を size_t に置き換えると、int が < 0 になる可能性があるため修正され、当然のことながら分析エラーが発生します。

これを修正するには、size_t または unsigned int に変更します。

静的分析ではアサートが考慮されないため、if は機能しますが、アサートは機能しません。警告を抑制したい場合は、次を追加できます。

_analysis_assume(i>0 && i < MY_MAX_VALUE)

これにより、i に期待される値がアナライザーに通知されます。

于 2014-03-17T10:57:11.813 に答える
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 に答える