コーディング規約違反が想定どおりに表示されない理由の診断
問題
コード行にコーディング ルール違反があると考えているが、Polyspace®Bug Finder™ 解析で違反が表示されません。
Polyspace Bug Finder での既定のコード解析では、予想される欠陥の一部が表示されない場合があります。予想される欠陥が表示されない場合、追加のチェッカーを有効にし、その解析に適したチェッカー オプションを指定する必要がある場合があります。次に例を示します。
void foo(int* p, int i) { *p = i; }
foo
は起点が不明のポインターをデリファレンスします。Bug Finder で、このポインターが汚染されたものとしてフラグ設定されると想定します。既定の Bug Finder 解析では汚染されたポインターは調査されません。現在の解析境界の外部を起点とするポインターに対して、汚染されたものとしてフラグを設定するには、チェッカー TAINTED_PTR
を有効にします。その後、オプション -consider-analysis-perimeter-as-trust-boundary
を使用して信頼の境界を制限します。考えられる解決策
ルール チェッカーが有効であるかどうかをチェックする
必要なルールを除外した、絞り込まれたコーディング ルールのサブセットが有効になっている可能性があります。
たとえば、MISRA C™:2012 ルールをチェックする場合、解析では既定で mandatory-required
サブセットのみが有効になります。その他の MISRA C:2012 ルールをチェックするには、該当するオプションを指定します。
使用するコーディング ルール オプションを確認します。コーディング規約およびコード メトリクスを参照してください。
ソース ファイルが解析から除外されているかどうかをチェックする
既定では、ソース ファイルと同じ場所にないヘッダー ファイルのコーディング ルール違反は非表示になります。一部のソース ファイルは、意図的にコーディング ルール解析の対象から除外されている場合があります。次に対する結果を生成しない (-do-not-generate-results-for)
を参照してください。そのようなファイルを解析する場合、ファイル内のすべてのコーディング ルール違反が非表示になる可能性があります。
ルール違反の発生場所がマクロの中であるかどうかをチェックする
マクロ定義でルール違反が発生した場合、Polyspace はその結果をそのマクロ定義の中で一度だけ表示します。マクロのインスタンスでの違反が報告されるのは、マクロのインスタンスのパラメーターが原因で明示的にルール違反が発生した場合のみです。マクロ定義がヘッダー ファイルで行われる場合、結果で非表示になる可能性があります。マクロを含む行での Polyspace の結果も参照してください。マクロでのコーディング ルール違反が予想される場合には、次のようにします。
マクロ定義での違反をチェックします。
マクロ定義がヘッダー ファイルにある場合は、ヘッダー ファイルでのコーディング ルール違反を非表示にしているかどうかをチェックします。
次に対する結果を生成しない (-do-not-generate-results-for)
を参照してください。
[ソース] ペインで、行にマクロ展開が含まれるかどうかを調べるには、 アイコンを探します。
コンパイル エラーをチェックする
解析のソース ファイルがコンパイルされていない場合、コーディング ルールのチェックは不完全なままになります。コーディング ルール チェッカーの結果は次のようになります。
コンパイルされなかったファイルの完全な結果が含まれない場合がある。
一部のルールはコンパイルが完了した後にのみチェックされるため、コンパイルされたファイルの完全な結果が含まれない場合がある。
コンパイル エラーをチェックします。Polyspace 解析が停止したときのエラー情報の表示を参照してください。
ルール チェッカーを拡張する必要があるかどうかをチェックする
コード内の一部の構成要素が、特定のコンテキストにおいてコーディング ルールに違反している可能性があります。既定の Bug Finder 解析では、誤検知を減らすために、これらの潜在的な違反を報告しない場合があります。既存の Bug Finder コーディング ルール チェッカーを拡張して、これらの問題を検出します。これらのオプションを使用して、チェッカーの動作を変更します。
-consider-analysis-perimeter-as-trust-boundary
:既定では、Polyspace はユーザー入力のみを汚染されたものと見なします。このオプションを使用することで、現在の解析境界の外部を起点とするすべてのデータを汚染されたものと見なします。Polyspace 解析での汚染のソースを参照してください。-detect-atomic-data-race
:既定では、Polyspace は、特定の操作はアトミックであると仮定し、それらの操作をデータ レース チェックから除外します。ご使用の環境では、これらの操作はアトミックではない可能性があります。想定されるアトミック操作を含めるようにデータ レース チェッカーを拡張するには、このオプションを使用します。Extend Data Race Checkers to Atomic Operationsを参照してください。
Bug Finder チェッカーを拡張または変更するオプションのリストについては、Bug Finder チェッカーの既定の動作の変更を参照してください。
解析でコードに関する追加情報が必要であるかどうかをチェックする
Polyspace では、特定のコーディング ルール違反を検出するために、コードに関する追加情報が必要になる場合があります。次に例を示します。
標準ライブラリ数学関数の正しい使用に関連するルール チェッカー。既定では、これらのチェッカーは、標準ライブラリ数学関数の無効な使用をチェックします。ドメインなどの制約があるカスタム数学ライブラリを使用する場合、既定の Polyspace 解析ではこれらの制約の違反を検出できません。カスタム ライブラリ関数に標準ライブラリ数学関数に類似したドメインや制約が含まれている場合、カスタム ライブラリをチェックするようにこれらのチェッカーを拡張できます。標準ライブラリ関数用の Bug Finder チェッカーのカスタム ライブラリへの拡張を参照してください。
マルチタスキングの問題に関連するルール チェッカー。既定では、特定のライブラリにあるルーチンを使用した場合には、Polyspace Bug Finder がスレッド作成と保護メカニズムを自動的に検出します。Polyspace でのスレッド作成とクリティカル セクションの自動検出を参照してください。Polyspace でサポートされないカスタム同時実行ライブラリを使用している場合に潜在的な欠陥を検出するには、次のいずれかを行います。
可能であれば、カスタム ライブラリをサポート対象ライブラリにマッピングします。サポートされていないマルチスレッド環境への同時実行欠陥チェッカーの拡張を参照してください。
解析を手動で設定します。Polyspace マルチタスキング解析の手動設定を参照してください。
ブロックリストに登録されたキーワードと関数の使用に関連するルール チェッカー。これらのチェッカーでは、ブロックリストに登録されたキーワードや関数が指定されない場合、ブロックリストに登録されたキーワードと関数にフラグを設定することができません。Bug Finder チェッカーを使用した非推奨の関数または安全でない関数、キーワード、またはマクロのフラグ設定を参照してください。
動的メモリとリアルタイム関数の使用に関連するルール チェッカー。これらのチェッカーでは、リアルタイム関数と動的メモリを割り当てる関数が指定されていない場合には、動的メモリの使用やリアルタイム関数におけるその他の違反にフラグを設定できません。Modify Bug Finder Checkers Through Code Behavior Specificationsを参照してください。
コードに関する追加情報が必要になるチェッカーの完全なリストについては、Bug Finder チェッカーの既定の動作の変更を参照してください。
ルールがソース ファイルに適用されるかどうかをチェックする
一部のコーディング ルールはヘッダー ファイルにのみ適用されます。非ヘッダー ソース ファイルでは、これらのルールの違反は報告されません。たとえば、MISRA C++:2008 Rule 3-1-1
や AUTOSAR C++14 Rule A3-1-1
などのルールの違反は、ヘッダー ファイルのみで報告されます。
ルール違反の発生場所が未呼び出しの関数 static
の中であるかどうかをチェックする
コーディング ルールの違反を検出するために関数間でのデータ伝搬を追跡する必要がある場合、この違反は手続き間ルール違反と呼ばれます。Bug Finder は次に示す種類の関数では手続き間ルール違反をチェックしません。
main()
関数または別のstatic
以外の関数から直接または間接的に呼び出されない関数static
。上記の関数
static
からのみ呼び出される関数。
関数 static
の手続き間コーディング ルール違反を検出するには、コードで関数 static
を呼び出します。
違反の発生場所が未使用のコードの中であるかどうかをチェックする
Bug Finder は、コードが未使用である場合、そのコード構成要素でのコーディング ルール違反を報告しません。次に例を示します。
テンプレートとマクロ:インスタンス化されていないテンプレートと未使用のマクロでは、一部のコーディング ルールの違反は報告されません。
関数宣言と typedef:未使用の関数宣言と typedef では、宣言と typedef の不一致をチェックするコーディング ルールの違反は報告されない可能性があります。
これらのコード構成要素で発生する可能性があるすべてのコーディング ルール違反をチェックするには、コードの中でそれらを 1 回以上呼び出してください。
必要なマルチタスキング オプションが指定されているかどうかをチェックする
マルチタスキング関連のルール チェッカーでは、これらのルール違反を確認するために、同時実行オプションを指定する必要がある場合があります。
Polyspace はいくつかのマルチタスキング ライブラリを自動検出します。Polyspace でのスレッド作成とクリティカル セクションの自動検出を参照してください。ライブラリによっては、マルチタスキング オプションを手動で構成することが必要になる場合があります。Polyspace マルチタスキング解析の手動設定を参照してください。また、オプション -code-behavior-specifications
を使用して、サポートされているライブラリにご使用のライブラリをマッピングできます。サポートされていないマルチスレッド環境への同時実行欠陥チェッカーの拡張を参照してください。
MISRA C コーディング ルール違反の発生場所が条件付きプリプロセッサ ブロックの中であるかどうかをチェックする
#if
や #ifdef
などの条件付きプリプロセッサ ブロック内のコードは、条件が false の場合は前処理済みのコードから除外されます。MISRA C コーディング ルールは、前処理後に残っているコードに適用されます。条件付きプリプロセッサ ブロック内でのルール違反は、条件が false の場合は報告されません。たとえば、次のコードを考えてみましょう。
#ifdef MACRO_ACTIVATION_1 typedef unsigned char activation_by_macro_uchar; //Unused type #endif
MACRO_ACTIVATION_1
が定義されていない場合、#ifdef
ブロック内のコードは前処理済みのコード内にありません。この場合、この行の MISRA C コーディング ルール違反は報告されません。参考
次に対する結果を生成しない (-do-not-generate-results-for)
| -code-behavior-specifications
| -consider-analysis-perimeter-as-trust-boundary
| -detect-atomic-data-race