メインコンテンツ

コーディング規約違反が想定どおりに表示されない理由の診断

問題

コード行にコーディング ルール違反があると考えているが、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 では、特定のコーディング ルール違反を検出するために、コードに関する追加情報が必要になる場合があります。次に例を示します。

コードに関する追加情報が必要になるチェッカーの完全なリストについては、Bug Finder チェッカーの既定の動作の変更を参照してください。

ルールがソース ファイルに適用されるかどうかをチェックする

一部のコーディング ルールはヘッダー ファイルにのみ適用されます。非ヘッダー ソース ファイルでは、これらのルールの違反は報告されません。たとえば、MISRA C++:2008 Rule 3-1-1AUTOSAR 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 コーディング ルール違反は報告されません。

参考

| | |

トピック