PRQA Framework (QAC / QAC++) に関する重要なお知らせ
Perforce Software, Inc.
●━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━◎
PRQA Framework (QAC / QAC++) に関する重要なお知らせ
─────────────────────────────────
「データフロー解析におけるクエリタイムアウト値の設定について」
◎━━━━━━━━━━━━━━━━━━━━━【株式会社東陽テクニカ】━●
お客様各位
平素より弊社商品をご愛用いただき、誠にありがとうございます。
さて、PRQA Framework (QAC / QAC++) のクエリタイムアウトの設定値が
大きい場合、解析時間が必要以上に長くなり、また、その影響で関数
タイムアウトが発生しやすくなっている可能性があります。
詳細と対処方法を以下の通り報告いたします。
お手数をお掛けいたしますが、対象のお客様におかれましては、
対策を講じていただきますよう、宜しくお願い申し上げます。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
〇 対象製品
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
PRQA Framework 2.1.0(QAC 9.1.0 / QAC++ 4.1.0)以降のバージョン
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
〇 対象ユーザー
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
・対象バージョンの QAC / QAC++ をお使いで、
・データフロー解析(DFA)のクエリタイムアウト値が 1000(ミリ秒)を
超える設定を使用されている方
※PRQA Framework 2.1.0(QAC 9.1.0 / QAC++ 4.1.0)や
PRQA Framework 2.2.1(QAC 9.3.1 / QAC++ 4.1.0)で
DFA のプリセットDepth 4・Depth 5 をお使いの場合、
クエリタイムアウト値が 1000(ミリ秒)を超える設定になっています。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
〇 影響
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
クエリタイムアウトの設定値が大きいため、解析時間が必要以上に
長くなっている恐れがあり、また、その影響で関数タイムアウトが
発生しやすくもなっています。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
● 対処方法/手順
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
以下の3つの手順を行っていただきますよう、お願いいたします。
■解析設定
プロジェクトプロパティの解析設定で以下の2つを設定してください。
1.クエリタイムアウト値の変更
クエリタイムアウト値を 1000(ミリ秒)に設定
2.オプションの追加設定
df::query_timeout_message+ の設定を追加
<設定例>
-prodoption df::query_timeout_message+
-prodoption df::query_timeout=1000
-prodoption df::function_timeout=60000
-prodoption df::inter=5
■メッセージ設定
df::query_timeout_message+ の設定は、クエリタイムアウトが
発生した際に「メッセージ 2758」を出力します。
プロジェクトプロパティのルール設定で、“メッセージ 2758 が
有効”であることをご確認ください。
※詳しくは、PRQA Framework のコンポーネントマニュアルの
「解析設定」および「ルール設定」の章をご覧ください。
PRQA Framework のコンポーネントマニュアルは、
<PRQA Frameworkインストール先>\common\doc-ja_JP\manual\pdf
にあります。
◆解析精度に影響がないことの確認
最後に「メッセージ 2758」が発生していないことをご確認ください。
クエリタイムアウトが発生していないことが、クエリタイムアウト値を
1000(ミリ秒)など短く設定しても設定値が十分に大きいこと、
つまり解析の精度に影響していないことの確認になります。
もし、クエリタイムアウトが発生していましたら、
クエリタイムアウト値を 1100 や 1200 など少し大きくして、
「メッセージ 2758」が出なくなるまでお試しください。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
※ 参考
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
0)QAC / QAC++ のデータフロー解析(DFA)について
QAC / QAC++ のDFAの仕組み、クエリタイムアウトや関数タイムアウト
については、保守ユーザー様向けページの「QA・C/QA・C++利用ガイドなど」
にあります「QA・C8.0J-Rバージョンアップセミナー資料」をご覧ください。
1)クエリタイムアウト値と解析時間について
QAC / QAC++ は2種類のクエリを使用します。
1つ目のクエリがタイムアウトすると、2つ目のクエリが発行されます。
そして、2つのクエリが両方ともタイムアウトした場合に、クエリタイム
アウトメッセージ(メッセージ 2758)が出力されます。
1つ目のクエリがタイムアウトした後、2つ目のクエリはタイムアウトせず
解析が続行される場合があります。そのため、クエリタイムアウト値を
小さくすることで、解析時間の短縮が見込まれます。
メーカーの調査によると、クエリに対する結果が返る場合は、コードの
内容や解析にお使いのマシンのスペックにも因りますが、概ね1秒以内に
返ってくるという結果が得られています。言い換えると、1秒で結果が
返らないクエリは、その後どれだけ経っても返らずタイムアウトします。
そのため、まずはクエリタイムアウトの値を1000(ミリ秒)に
設定くださいますようお願いしております。
例:クエリタイムアウトを10秒から1秒に変更した場合
・クエリタイムアウト変更前
クエリ1:(10秒でタイムアウト)
クエリ2:(1秒以内に結果が返り解析続行)
合計 :(10~11秒)
・クエリタイムアウト変更後
クエリ1:(1秒でタイムアウト)
クエリ2:(1秒以内に結果が返り解析続行)
合計 :(1~2秒)
2)DFA のプリセットについて
QAC 9.1.0 / QAC++ 4.1.0 以降では df::query_timeout_mesasge+ の
設定で、メッセージ 2758 によってクエリタイムアウトを検知することが
できるため、クエリタイムアウト値を関数タイムアウト値より大きく
設定する必要はなくなっていますが、DFAのプリセットDepth 5において
クエリタイムアウト値が関数タイムアウト値より大きく設定されている
理由は、古いバージョン(QAC 8.2.2 / QAC++ 3.2.2 以前)の名残です。
QAC 8.2.2 / QAC++ 3.2.2 以前は、関数タイムアウトが発生した場合は
メッセージ 2755 で検出することができましたが、クエリタイムアウトが
発生したことを検出する方法(メッセージ 2758)がなかったため、
関数タイムアウト60000、クエリタイムアウト60001 と設定することで、
クエリタイムアウトが発生した場合には必ず関数タイムアウトも
発生するようにして、間接的にクエリタイムアウトを検知していました。
なお、PRQA Framework 2.4.0(QAC 9.5.0 / QAC++ 4.3.0)以降では、
プリセットの設定値が変更され、Depth 5の設定は次の通りとなっています。
-prodoption df::query_timeout_message+
-prodoption df::query_timeout=1000
-prodoption df::function_timeout=60000
-prodoption df::inter=5
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ お問い合わせ先 ■
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
本件についてご不明点・ご質問等ございましたら、
テクニカルサポートにお問い合わせください。
株式会社東陽テクニカ ソフトウェア・ソリューション
TEL:03-3245-1248(直通)
E-mail:ss_support@toyo.co.jp
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━