先日、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);
多くの場合、コンパイラはコンパイル時にインデックス変数がこれらの範囲外にある可能性があることを証明し、コンパイル時に警告を発行できると思います。
これは、コンパイラーが通常実行するには非常に多くの作業になる可能性があることを認識していますが、おそらくこの種の分析を実行できるツールがいくつかありますか?私はグーグルで何も見つけることができませんでしたが、私はこの種のものが存在するかどうか疑問に思いましたか?それとも、たぶん役に立つのに十分なことをするのは難しすぎるのでしょうか?