ページ ツリー

このページの古いバージョンを表示しています。現在のバージョンを表示します。

現在のバージョンとの相違点 ページ履歴を表示

« 前のバージョン バージョン 3 現在のバージョン »

 コンテンツ

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 8.2.2 / QAC++ 3.2.2 (PRQA Framework 1.0.5) 以前は ITU を実施することはできません


解析を2回実施する

QAC / QAC++ の解析は翻訳単位ごとに実施されます。
ITU を実施する場合、解析される翻訳単位の順序によって解析結果に影響が出る可能性があります。

例を示します。

/*** test1.c ***/
int func1(void){ 
  return 0; 
}
/*** test2.c ***/
int func2(int n){ 
  int a; 
  int r; 
  a = func1(); 
  r = n / a; 
  return r; 
}


 ・func1 の翻訳単位が先に解析された場合

func2 の解析時に func1 の結果を利用して変数 a の取り得る値を特定することができます。
そのため func2 の 5 行目にはメッセージ2831が出力されます。

メッセージ2831 D: 明らかにゼロで除算しています。


・func2 の翻訳単位が先に解析された場合

func2 の解析時に func1 の結果が存在しないため変数 a の取り得る値を特定することができません。
そのため func2 の 5 行目にはメッセージ2834が出力されます。

メッセージ2834 P: ゼロ除算が発生する可能性があります。


解析順序による結果の違いを防ぐために、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 10.2.0 / QAC++ 5.2.0 (Helix QAC 2022.1) 以降では --inter-tu-dataflow オプションを付けて解析すると自動的に -prodoption df::cma+ が設定されます。


   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>

注意

<n> の部分に解析回数を指定します。例えば --repeat 2 2回解析する設定です。
QAC 9.1.0 / QAC++ 4.1.0 においては <n> の値を大きくするほど解析の精度は高まりますが、その分、解析時間も長くなります。
ただし --repeat を指定しない(つまり --repeat 1)場合と --repeat 2 の場合の差が最も大きくなります。

  • ラベルがありません