ページ ツリー

 コンテンツ

QAC 8.1.1 / QAC++ 3.0 以降

 

QAC / QAC++ のデータフロー解析(DFA)は、関数ごとに実施されますが、
関数間解析の深さ (-prodoption df::inter) の設定によって関数を跨るデータの追跡を行うことができます。

 

関数間解析の深さは 05 で設定します( : -prodoption df::inter=5)
設定値の意味は次のとおりです。

  0    : 関数間解析を実施しない(デフォルト)

  15 : 後述する展開可能な文(statement)の数を表し、この範囲内で展開可能な場合は関数間解析を実施する

関数間解析の深さのみの設定の場合、同一の翻訳単位内の関数に限りデータの追跡を行うことができます。
異なる翻訳単位の関数についてデータの追跡を行うには、関数間解析を行う設定に加えて、『翻訳単位間データフロー解析(ITU)』を実施する設定が必要です。


関数間解析は、呼び出す側の関数に呼び出される側の関数が展開されて行われます。

例を示します。 

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


 ・関数間解析を実施する場合

呼び出す側(func2)の解析時に呼び出される側(func1)が展開されます。
そのため 8 行目において変数 a の取り得る値を特定することができ、 9 行目にはメッセージ2831が出力されます。

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


・関数間解析を実施しない場合

呼び出す側(func2)の解析時に呼び出される側(func1)は展開されません。
そのため 8 行目において変数 a の取り得る値を特定することができず 9 行目にはメッセージ2834が出力されます。

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


展開可能な文(statement)の数

関数間解析の深さの設定値 15 は、呼び出す側の関数に展開可能な呼び出される側の関数の文の数を 2 x 10n で表します。
つまり、設定値が 1 の場合は最大で 20 文、設定値が 5 の場合は最大で 20万 文 を展開することができます。

※展開される関数は、最適化されたり実引数と仮引数の変換などが行われるため、実コードの文の数と完全に一致するわけではありません。

この設定で展開しきれない場合は、関数間解析は実施されません。

例えば、関数間解析の深さの設定値が 1 の場合で、呼び出される側の関数が 100 文の場合、
呼び出される側の関数は展開されず、その部分の関数間解析は実施されません。
呼び出される側の関数が 20 文まで展開されて解析されるわけではありません。

・関数間解析の深さの設定値が 5 の場合で、呼び出される側の関数を展開できない場合はメッセージ2756が出力されます。

メッセージ2756 '-po df::inter'の最大値では、'%1s'への関数呼出しを展開できませんでした。


QAC 8.0 以前は関数間解析を実施することはできません

QAC++ 2.5.1 以前は DFA の機能自体が存在しません