QAC 9.1.0 / QAC++ 4.1.0 (PRQA Framework 2.1.0) 以降
QAC / QAC++ のデータフロー解析(DFA)は、関数ごとに実施されますが、
『は、関数ごとに実施されますが、『関数間解析』の設定によって関数を跨るデータの追跡を行うことができます。関数間解析のみの設定の場合、データの追跡は同一の翻訳単位内の関数に限られますが、
関数間解析の設定に加えて翻訳単位間データフロー解析
関数間解析の設定だけの場合、データの追跡は同一の翻訳単位内の関数に限られますが、関数間解析の設定に加えて翻訳単位間データフロー解析(ITU)の設定をすることで、異なる翻訳単位の関数についてデータの追跡を行うことができます。
...
※ QAC 8.2.2 / QAC++ 3.2.2 (PRQA Framework 1.0.5) 以前は ITU を実施することはできません
解析を2回実施する
QAC / QAC++ の解析は翻訳単位ごとに実施されます。
ITU を実施する場合、解析される翻訳単位の順序によって解析結果に影響が出る可能性があります。
例を示します。
次の例では、test2.c の翻訳単位に定義された関数 func2 から test1.c の翻訳単位に定義された関数 func1 が呼び出されています。このデータの追跡を行うには、すわなち test2.c の4行目で変数 a が取り得る値を判断するにはITUが必要です。
コード ブロック | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
int func1(void){ return 0; } |
コード ブロック | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
int func2(int n){ int a; int r; a = func1(); r = n / a; return r; } |
...
解析を2回実施する ※QAC 10.4.0 / QAC++ 5.4.0 (Helix QAC 2022.3) 以前
ITU を含めてデータフロー解析は qac / qacpp コンポーネントによる『1次解析』で実施されます。1次解析は翻訳単位ごとに実施されます。
ITU を実施する場合、解析される翻訳単位の順序によって解析結果に影響が出る可能性があります。
上の test1.c, test2.c の例で説明します。
・func1 の翻訳単位が先に解析された場合
func2 の解析時に func1 の結果を利用して変数 a の取り得る値を特定することができます。
そのため func2 の 5 行目にはメッセージ2831が出力されます。
...
解析順序による結果の違いを防ぐために、ITU を実施する場合は解析を2回実施することをお勧めします。
2回解析を実施すると、少なくとも2回目の解析時に1回目の解析結果を使用することができます。
つまり上述の例で、必ず func1 の結果が存在する状態で func2 の解析を行うことができるようになり、より精度の高い解析になります。
2回の解析を行う方法は以下の通りです。
■ QAC 9.3.1 / QAC++ 4.1.0 (PRQA Framework 2.2.1) 以降
解析コマンド qacli analyze に --inter-tu-dataflow オプションを付けて解析します
パネル | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
qacli analyze -P <プロジェクトパス> -f --inter-tu-dataflow |
注意 | ||
---|---|---|
| ||
--inter-tu-dataflow は後述の --repeat 2 に相当する設定です。 |
QAC 9.8.0 / QAC++ 4.6.0 (Helix QAC 2020.1) 以降では GUI で解析を2回実施する設定が可能です
- QAC 9.9.0 / QAC++ 4.7.0 (Helix QAC 2020.2) 以降
[プロジェクト] > [プロジェクトプロパティ] の解析タブ内「翻訳単位間解析」にチェックを入れます
※この設定はプロジェクトごとの設定です
※ QAC 10.2.0 / QAC++ 5.2.0 (Helix QAC 2022.1) 以降では
「翻訳単位間解析」にチェックを入れて解析すると自動的に -prodoption df::cma+ が設定されます
- QAC 9.8.0 / QAC++ 4.6.0 (Helix QAC 2020.1)
[解析] > [解析設定] 内の「翻訳単位間解析を有効にする」にチェックを入れます
※この設定はアプリケーションの設定、つまりどのプロジェクトにも適用される設定です
■ QAC 9.1.0 / QAC++ 4.1.0 (PRQA Framework 2.1.0)
解析コマンド qacli analyze に --repeat オプションを付けて解析します
パネル | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
qacli analyze -P <プロジェクトパス> -f --repeat <n> |
...
title | 注意 |
---|
...
2回の解析を行う方法は『ITUの設定』をご覧ください。