シェープ解析
シェープ解析は通常のポインタ解析より強力だが、ポインタ解析の形態のひとつである。ポインタ解析ではポインタが示す可能性があるオブジェクト群(ポインタの指し示す集合)を特定する。しかし、こうした解析は必然的に推測であり、決定論的ではない(完全に正確な静的解析は停止性問題を解くことができないため)。シェープ解析では、ポインタの指す集合を狭い範囲に(より正確に)特定することができる。
下のような単純な C++ のプログラムを考える。
このプログラムはオブジェクトの配列を構築し、任意の方法でこれらを処理し、その後解放する。process_items 関数に問題がなければこのプログラムは安全であり、解放されたメモリを参照することはなく、きちんと初期化されたオブジェクトを削除する。
なお、大半のポインタ解析手法はこのプログラムを正確に解析することが困難である。ポインタの指し示す集合を特定するためには、ポインタ解析によってプログラムのオブジェクトに名前をつけることが可能でなければならない。
配列の要素 0..i-1 は初期化されたオブジェクトを格納している。配列の要素 i が初期化されるようとしているとき、後続の要素は初期化されていない。シェープ解析ではこうした状況を要素の最初の、すなわち要素 i の実体化されたメモリ上の位置、および残りの未初期化されていないメモリ位置に対する要約を用いて、以下のように推測することができる。
行 [2] でループ処理が完了すると、オブジェクトを実体化したままにしておく必要はなくなる。シェープ解析では、この時点ですべての配列要素が初期化済みであると判断する。
しかし、行 [3] では、配列の要素 i が再び使用される。そのため、解析では行 [1] で行ったように、配列を 3 つの領域に分割する。今回は、i 以前の領域は解放済みであり、残りの要素はまだ生存している(delete 文が実行されていなければ)。
この場合、インデックスi のポインタがまだ解放されていないことを認識できる。このため、二重解放の警告を出すことはない。