抽象インタプリタとは

抽象インタプリタとは、関数を上から下に抽象的に評価し、コード中のさまざまな問題をチェックする機構です。

「抽象的に評価する」とは、コードのコンパイル結果を実際の実行環境上で動かすのではなく、開発者がコードレビューすることと同様に一回のチェックで想定される様々な条件を考慮しながら評価することを意味します。

例えば下記のようなコードを抽象インタプリタで評価すると、コメントに記載されているような問題を発見することができます。

エラー処理漏れ

int *p = (int *) malloc(sizeof(int) * 10);

if (p) {
    memset(p, 0, sizeof(int) * 10);
}
/* else ブランチによる malloc() 失敗時のエラー処理が抜けている */

...snip...

p[2] = 5;  /* W0422: NULL になることがあるポインタをデリファレンス! */

デッドコード

int i = all_possible_values_of_int();

...snip...

if (i < 0) {
    unsigned int ui = zero_if_succeeded();

    if (ui > 0) {
        return;
    }

    /* この時点では ui == 0 が確定 */

    ...snip...

    if (i < ui) { /* 常に条件が成立しそうに見えるが、実は常に偽となる */
        return; /* W9001: この文には制御が到達しません! */
    }

/* ISO 規格は、式 i < ui の評価前に Usual Arithmetic Conversion により
 * オペランドを変換するとしています。
 * 変換により、式 i < ui は (unsigned int) i < ui を評価するのと同等の
 * 結果となります。
 * この時点では、i は 0 より小さい値を持っていることが確定していますが、
 * 変換時のラップアラウンドにより (unsigned int) i は 0 より大きい値に
 * 変換されます。
 * したがって、式 ("0 より大きい値" < 0) は常に偽と評価され、return 文は
 * デッドコードとなります。
 */

>> トップへ戻る