C and C++ Binaries


DIAG.UNEX.CALL : 解析されない呼び出し

要旨

CodeSonarの解析では、関数内のいくつかのコードは解析されません;解析されないもののなかで最も重要な命令文の形式は呼び出しとなります。

これと、その他の解析されないコードのワーニングクラスは一般的に全てのコードの解析を許可する SEARCH_BOUND 設定パラメータの値が十分に高くないために起こります。

これらのワーニングを減らすためにこの値を高くすると、解析時間が長くなります。

実際のプログラムの多くでは、解析されないコードの全てのワーニングを出力しないように search bound を高くすると、実用的ではないほど解析時間が長くなります。

これらのクラスは、パスカバレッジよりもコードカバレッジに関係しています。いくつかの場合では、プロシージャを介した可能性のあるパスの厳密なサブセットのプロシージャ内の全てのコードを網羅することは可能です。

プロパティ

クラス名 Unexercised Call
日本語クラス名 解析されない呼び出し
クラス分類 診断 (diagnostic)
ニーモニック DIAG.UNEX.CALL
カテゴリー
MisraC2023 MisraC2023:2.1 A project shall not contain unreachable code
Misra2012 Misra2012:2.1 A project shall not contain unreachable code
Misra2004 Misra2004:14.1 There shall be no unreachable code
AUTOSARC++14 AUTOSARC++14:M0-1-1 A project shall not contain unreachable code.
  AUTOSARC++14:M0-1-2 A project shall not contain infeasible paths.
MisraC++2008 MisraC++2008:0-1-1 A project shall not contain unreachable code.
  MisraC++2008:0-1-2 A project shall not contain infeasible paths.
MisraC++2023 MisraC++2023:0.0.1 A function shall not contain unreachable statements
CWE CWE:561 Dead Code
CERT-C CERT-C:MSC07-C Detect and remove dead code
  CERT-C:MSC12-C Detect and remove code that has no effect or is never executed
JSF++ JSF++:186 There shall be no unreachable code.
DISA-3r10 DISA-3r10:V-6149 The designer will ensure the application does not contain source code that is never invoked during operation, except for software components and libraries from approved third-party products.
対応言語 C および C++ で利用可能です。
有効/無効設定 このワーニングクラスのチェックはデフォルトで無効になっています。チェックを有効にするにはプロジェクト設定ファイル (configuration file)に以下の WARNING_FILTER ルールを追加してください。
WARNING_FILTER += allow class="Unexercised Call"

簡潔な説明のために、設定値を減らすために、設定ファイルで以下の設定を加えたとします。

SEARCH_BOUND=3

SEARCH_BOUND=3の場合、CodeSonarはunex_call()のプロシージャの3つのパスのみ探索します。

しかしながら、プロシージャには4つのパスがあり、3つのパスのみが探索された場合、switch caseの一つは解析されません。

各々の switch caseで最も重要な命令文の形式は呼び出しなので、解析されない呼び出しワーニングはそれらの文のいずれか一つで発生します。

ソースコードの中でどの一つなのかを正確に予想することはできません。それはCodeSonarのビルドと解析のいくつかの現象によります。

void f(void);
int g(void);

void unex_call(int j)
{
    int i=g();
    switch( j )
    {
    case __LINE__: f(); j++; if (i) i=4; return; break;  /* 'Unexercised Call' warning issued either here... */
    case __LINE__: f(); j++; if (i) i=4; return; break;  /* ...or here... */
    case __LINE__: f(); j++; if (i) i=4; return; break;  /* ...or here... */
    default: f(); j++; if (i)  i=4; return; break;       /* ...or here. */ 
    }
}

注釈

以下のテーブルリストは重要度に応じた解析されないワーニングクラスで、最も重要な(”解析されない呼び出し”)が最初に来ています。実行されない呼び出しブロックに関連したワーニングクラスはブロック内の命令文で最も重要なクラスに適用されます。

ワーニングクラス名 解析されないセットで最も重要な命令文
Unexercised Call
解析されない呼び出し
呼び出しサイト
Unexercised Computation
解析されない計算
加算等のデータ計算を実行する命令文
Unexercised Conditional
解析されない条件文
if, while, switch, ?, &&, || 等の分岐命令
Unexercised Data Flow
解析されないデータフロー
単純な割り当て、値を持ったリターン命令
Unexercised Control Flow
解析されないコントロールフロー
break, goto, continue もしくは値の無いリターン等のコントロールフローに影響する、分岐ではない命令文

関連のある設定ファイルパラメータ

設定ファイルの以下のパラメータがこのワーニングクラスのチェックに影響します。