ページ ツリー

 コンテンツ

QAC 8.0 / QAC++ 3.0 以降


QAC / QAC++ のデータフロー解析(DFA)は関数ごとに行われ、その関数内で使用される変数が取りうる値の範囲を考慮して問題を指摘します。

関数内で使用する変数の数が多いほど、分岐などで変数が取りうる値の範囲が多く複雑になるほど、必要な解析時間やメモリ量は多くなります。

従って、関数を分割するなど使用する変数を減らす、あるいは分岐を少なくすることで、必要な解析時間やメモリ量を少なくすることができます。

また、変数の値をチェックしてから使用するコードになっていると、DFAで追跡が必要な範囲が絞られるため、解析時間やメモリ量を少なくすることができます。


1)
の値をチェックせずに 500 行目で使用しています。
DFA は の値が配列の領域内であることをチェックするために、この間の約 500 行の内容を解析する必要があります。
関数間解析』を実施する設定の場合は、この間に呼び出される他の関数の内容を解析する必要がある場合もあります。

その結果、必要な解析時間やメモリ量は多くなります。

例1

 1:    int g[10];
 2:    void foo(void){
 3:        int b;

              (中略:この中でbの値が設定される)

500:        g[b] = 0;
501:        return;
502:    }


2)
の値をチェックした後、504 行目で使用しています。
そのため、この間の約 500 行の内容を解析することなく、配列の領域内であることが確認できます。

その結果、必要な解析時間やメモリ量は少なくなります。 

例2

 1:    int g[10];
 2:    void foo(void){
 3:        int b;

              (中略:この中でbの値が設定される) 

500:        if ( (b < 0) || (9 < b) ){
501:            /* エラー処理 */
502:        }
503:        else{
504:            g[b] = 0;
505:        }
506:        return;
507:    }