特定のシステム入力値から欠陥を見つけるための 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 は Code Prover の正常で網羅的な解析を提供するわけではないことに注意してください。たとえば、Bug Finder がチェッカー拡張後にエラーを検出しなかった場合でも、エラーが検出されないことが、Code Prover におけるグリーン チェックと同様の保証となるわけではありません。
チェッカーの拡張
チェッカーを拡張して、上記の問題を検出するには、以下のオプションを使用します。
システムのすべての入力値を考慮する、さらに厳密なチェックを実行 (-checks-using-system-input-values):このオプションを有効にします。数値に依存するチェッカーは、呼び出し先が 1 つ以上の関数のすべての入力値を考慮できるようになりました。次のオプションを使用して、考慮される関数を変更できます。次の関数の入力を考慮する (-system-inputs-from):値customを使用して、入力を考慮する必要がある関数の名前 (この場合はspeed) を入力します。コマンド ラインで、オプション引数custom=speedを使用します。
Bug Finder 解析を実行すると、除算演算で発生する可能性のある 0 による整数除算が表示されます。結果には、最終的に現在の欠陥 (分母の 0 値) につながる関数 speed に対する入力値の例が表示されます。

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

拡張可能なチェッカー
以下のチェッカーは、入力の数値の影響を受け、前述のオプションを使用して拡張できます。
Bug Finder 欠陥:
AUTOSAR C++14 コーディング ルール:
CERT C ルールと推奨事項:
CERT C++ ルール:
MISRA C:2012 のルール:
MISRA C++:2008 のルール:
ISO/IEC TS 17961 ルール:
JSF AV C++ コーディング ルール:JSF AV C++ coding rule 142
CWE ルール: