3

先日、c ++で関数を書いていましたが、間違いを防ぐためにコンパイラーがもっと多くのことを実行できることに気づきました。私のコードの本質はこのようなものでした-

void method(SomeType* p)
{
    assert(p != 0);
    p->something();
}

そしてそれはこのように呼ばれました

SomeType p = NULL;
if (SomeCondition)
{
    p = some_real_value;
}

method(p);

明らかに、実行時にpがnullになる可能性があるため、デバッグビルドでメソッドのアサーションが失敗する可能性があります。私の間違い。

ただし、コンパイラがコンパイル時にこれをキャッチし、アサーションに違反している可能性があることを検出したことを示す警告を発行した可能性があります。

これは単純なケースであり、プログラムのフロー分析と各ポイントでの変数の可能な範囲の追跡に基づいて、コンパイラがそのポイントでポインタがNULLになる可能性があることを見つけるのはかなり簡単です。

多くのアサーションに違反するかどうかを判断するのは難しいと思いますが、アサーションに違反する可能性のあるコードを記述したことをコンパイラーが数回でも教えてくれた場合は、はるかに安全なプログラム。

たとえば、ループ内など、配列のインデックス作成で1つのエラーが発生するなどの問題に役立つと思います:-

assert(index >= 0 && index < array_size);

多くの場合、コンパイラはコンパイル時にインデックス変数がこれらの範囲外にある可能性があることを証明し、コンパイル時に警告を発行できると思います。

これは、コンパイラーが通常実行するには非常に多くの作業になる可能性があることを認識していますが、おそらくこの種の分析を実行できるツールがいくつかありますか?私はグーグルで何も見つけることができませんでしたが、私はこの種のものが存在するかどうか疑問に思いましたか?それとも、たぶん役に立つのに十分なことをするのは難しすぎるのでしょうか?

4

3 に答える 3

7

PC-lintなどの静的分析ツールは、これらの問題を検出できる場合があります。 http://www.gimpel.com/html/pcl.htm

ただし、最初の例に関しては、NULLが許容値でない限り、私のスタイルはポインタ引数または戻り値よりも参照を優先することです。これにより、引数が!=NULLであることを表明する必要がなくなります。

于 2009-12-24T10:12:51.947 に答える
3

Boostライブラリにはコンパイル時のアサートがあります。非常に簡単な例は次のとおりです。

#include <boost/static_assert.hpp>
...
BOOST_STATIC_ASSERT(1 > 0);

Boostには、あらゆる記述の包括的なコンパイル時ツールのセットがありますが、これらは、テストをコンパイル時不変として表現できる場合にのみ、コンパイル時に発生する可能性のある実行時障害を検出できます。

于 2009-12-24T10:12:36.563 に答える
2

この種のチェックを行うツールのクラスは、静的分析と呼ばれます。そのような例の1つは、 Coverity(商用製品であり、「いくら」を尋ねなければならない場合、それを買う余裕はありません)です。同じ目的で(C ++の場合)どのような種類のオープンソースツールが利用できるのかわかりません。

Javaの場合、FindBugsは優れた静的分析ツールです(Coverityほど包括的ではありませんが、家を抵当に入れて使用する必要はありません)。

于 2009-12-24T10:10:20.827 に答える