メインコンテンツ

特定のシステム入力値から欠陥を見つけるための Bug Finder チェッカーの拡張

このトピックでは、システム入力の特定の値から潜在的な欠陥を見つける方法を説明します。Code Prover と違って Bug Finder は、システム入力のすべての組み合わせのランタイム エラーを網羅的にチェックしません。ただし、一部の Bug Finder チェッカーを拡張して、ランタイム エラーにつながる可能性のある特定のシステム入力値が存在するかどうかを見つけることができます。

チェッカーの拡張が必要かどうかの特定

最初に、既存のチェッカーが要件を満たしているかどうかを特定します。

たとえば、Bug Finder チェッカー [整数のゼロ除算] は、除算演算の分母が 0 になる可能性があるかどうかを検出します。いくつかの算術演算の後にライブラリ関数で 0 による除算が発生する可能性があるとします。たとえば、次のような関数 speed を考えてみましょう。

#include <assert.h>

int speed(int k) {
    int i,j,v;
    i=2;
    j=k+5;
    while (i <10) {
            i++;
            j+=3;
    }

    v = 1 / (i-j); 
    return v+k;
}
プログラム実行がこの関数に入ったときに散発的なランタイム エラーが発生するが、既定の Bug Finder 解析がその問題を検出しないとします。誤検出を最小限に抑えるために、既定の解析は不明な入力の特定の値に起因する問題を抑制した可能性があります (実際には、この値が実行中に発生していなかった場合を想定)。Polyspace Bug Finder における入力も参照してください。散発的なエラーの根本原因を見つけるために、この関数専用のより厳格な Bug Finder 解析を実行できます。

チェッカーを拡張した後でも Bug Finder は Code Prover の正常で網羅的な解析を提供するわけではないことに注意してください。たとえば、Bug Finder がチェッカー拡張後にエラーを検出しなかった場合でも、エラーが検出されないことが、Code Prover におけるグリーン チェックと同様の保証となるわけではありません。

チェッカーの拡張

チェッカーを拡張して、上記の問題を検出するには、以下のオプションを使用します。

Bug Finder 解析を実行すると、除算演算で発生する可能性のある 0 による整数除算が表示されます。結果には、最終的に現在の欠陥 (分母の 0 値) につながる関数 speed に対する入力値の例が表示されます。

欠陥に対するツールヒントには、入力値がどのようにコード内で伝播され、最終的に欠陥を引き起こす一連の値に至るのかが表示されます。

Tooltips on variables in source code show how the input value of -19 leads to the final values that cause the division by zero defect.

拡張可能なチェッカー

以下のチェッカーは、入力の数値の影響を受け、前述のオプションを使用して拡張できます。

参考

トピック