コンテンツ
QAC 9.1.0 / QAC++ 4.1.0 (PRQA Framework 2.1.0) 以降
QAC / QAC++ のデータフロー解析(DFA)は、関数ごとに実施されますが、
『関数間解析』の設定によって関数を跨るデータの追跡を行うことができます。
関数間解析のみの設定の場合、データの追跡は同一の翻訳単位内の関数に限られますが、
関数間解析の設定に加えて翻訳単位間データフロー解析(ITU)の設定をすることで、異なる翻訳単位の関数についてデータの追跡を行うことができます。
ITU は -prodoption オプションで設定します。
-prodoption df::cma- : ITU を実施しない(デフォルト)
-prodoption df::cma+ : ITU を実施する
QAC / QAC++ の解析は翻訳単位ごとに実施されます。
ITU を実施する場合、解析される翻訳単位の順序によって解析結果に影響が出る可能性があります。
例を示します。
int func1(void){ return 0; }
int func2(int n){ int a; int r; a = func1(); r = n / a; return r; }
・func1 の翻訳単位が先に解析された場合
func2 の解析時に func1 の結果を利用して変数 a の取り得る値を特定することができます。
そのため func2 の 5 行目にはメッセージ2831が出力されます。
・func2 の翻訳単位が先に解析された場合
func2 の解析時に func1 の結果が存在しないため変数 a の取り得る値を特定することができません。
そのため func2 の 5 行目にはメッセージ2834が出力されます。
解析順序による結果の違いを防ぐために、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.3.1 / QAC++ 4.1.0 (PRQA Framework 2.2.1) 以降では、2回の解析で最大の精度で解析できるようになっています。
そのため --repeat オプションに代わって --inter-tu-dataflow オプションが導入されました。
■ QAC 9.1.0 / QAC++ 4.1.0 (PRQA Framework 2.1.0)
解析コマンド qacli analyze に --repeat オプションを付けて解析します
qacli analyze -P <プロジェクトパス> -f --repeat <n>
注意
<n> の部分に解析回数を指定します。例えば --repeat 2 は2回解析する設定です。
QAC 9.1.0 / QAC++ 4.1.0 においては <n> の値を大きくするほど解析の精度は高まりますが、その分、解析時間も長くなります。
ただし --repeat を指定しない(つまり --repeat 1)場合と --repeat 2 の場合の差が最も大きくなります。
※ QAC 8.2.2 / QAC++ 3.2.2 (PRQA Framework 1.0.5) 以前は ITU を実施することはできません