FAQ

QA・C/QA・C++

QA·C/QA·C++に関するに関するFAQ

Qクロスモジュール解析(CMA)とはなんですか?

A

ソース・コード解析の局面によっては完全なプロジェクト情報が必要となる場合があります。たとえば、間接的な関数の再帰的使用に関する精度の高い解析は、関数の定義が含まれるすべてのソース・ファイルにわたって行うことで初めて可能となります。クロスモジュール解析 (CMA) は、プロジェクト内のすべてのソース・ファイルについてこの種の追加解析を行えるようにするものです。

- CMA警告メッセージ例 -

" 関数 'name' が定義されていますが、このプロジェクトでは使用されていません。 "

保守作業の間に、最初の仕様で使用されている関数やオブジェクトが置き換えられたり冗長となり、プロジェクト内のどの場所でもオブジェクトが参照されていないことがあります。この場合、可能であれば、混乱を招かないようにその宣言を削除すべきであるため、上記メッセージが出力されます。

回答を閉じる

Qクロスモジュール解析(CMA)で、問題の発生箇所が1つに特定されない警告メッセージが検出されました。なぜですか?

A

クロスモジュール解析(CMA) の警告メッセージには、問題の発生箇所を1箇所に特定することができないものがございます。例えば 1510番のメッセージの場合、メッセージブラウザ上ではソースコードと共には出力されず、以下のように出力されます。 この例では、1510番のメッセージが指摘する問題は、「ここで 'alloca' が宣言されています。」というサブメッセージが示す3箇所が問題の発生箇所として考えられます。

- メッセージブラウザでの出力例

Msg(7:1510) 外部結合をもつ 'alloca' が、複数個宣言されていますが互換性がありません。
ここで 'alloca' が宣言されています。: alloca.c(139)
ここで 'alloca' が宣言されています。: getopt.c(47)
ここで 'alloca' が宣言されています。: getopt.c(191)

回答を閉じる

QQA C/QA C++の警告メッセージを英語で出力したいのですが出力することはできますか?

A
QA C/QA C++の解析結果はメッセージファイルを英語メッセージファイルに置き換えていただくことで、英語表示が可能となります。英語メッセージファイルは、各ソフトウェアのダウンロードページから取得していただけます。

以下、QA・C8.1.1-R、QA・MISRA MCM5.2J 、QA・MISRA M2CM3.2Jにおける英語メッセージファイルへの設定例となります。

- QA C8.1.1-R  英語メッセージファイル変更手順 QA・C8.1.1Jのインストールディレクトリ配下の bin\internat.rsc、bin\qac.msg、help\messages\*.*、help\language\*.*のバックアップを取得した上で、ダウンロードページから取得いただいた英語メッセージファイルに置き換えて下さい。

※MISRAオプションをご利用の際は、MISRAオプションのメッセージを置き換えていただくことで、英語表示が可能となります。

- QA MISRA MCM5.2J 英語メッセージファイル変更手順
MCMのインストールディレクトリ配下の messages\*.* のバックアップを取得した上で、ダウ
ンロードページから取得いただいた英語メッセージファイルに置き換えて下さい。
- 注意事項 -
QA・C8.1.1J本体の英語メッセージファイルも置き換えてからご利用ください。
- QA MISRA M2CM3.2J 英語メッセージファイル変更手順 M2CMのインストールディレクトリ配下の messages\*.* のバックアップを取得した上で、ダウンロードページから取得いただいた英語メッセージファイルに置き換えて下さい。
- 注意事項 -
 QA・C8.1.1J本体の英語メッセージファイルも置き換えてからご利用ください。
※ダウンロード用ユーザID、パスワードがご不明な際は、お手数ですが、弊社ライセンス係までお問合せいただけますでしょうか。

 

回答を閉じる

QSolaris/HP-UX/Linux版のQA·C/QA·C++の解析結果を、Windows版のQA·C/QA·C++で参照することはできますか?

FAQ ID:10

A
Solaris/HP-UX/Linux版のQA·C/QA·C++が生成した結果(*.errや*.met)には、 Solaris/HP-UX/Linuxの絶対パスの情報が含まれているため、 Windows版のQA·C/QA·C++で参照することはできません。

回答を閉じる

Q旧バージョンのQA·C/QA·C++の解析結果を、新バージョンのQA·C/QA·C++で参照することはできますか? また、新バージョンのQA·C/QA·C++の解析結果を、旧バージョンのQA·C/QA·C++で参照することはできますか?

FAQ ID:11

A
バージョンごとに、警告番号などの解析情報が異なっています。 そのため、あるバージョンで生成した結果(*.errや*.met)を、別のバージョンで参照することはできません。

異なるバージョンで解析結果を参照するには、解析しなおした後、結果を参照してください。
 

回答を閉じる

Qヘッダの抑止はCMA解析にどのように影響しますか?

FAQ ID:17

A
ヘッダが抑止されると、定義、関係、およびメトリックスのデータを含む、定義済みの項目に関する情報がmetファイルに書き出されないことが特に問題にな ります。その結果、再帰関数に関連するCMA診断のメッセージ出力が欠落する可能性があります。また、CMA生成メトリックスである「この関数を呼び出す 関数」(STM29)も誤った内容になるでしょう。
システム関数からユーザ・コードに戻される呼び出しは行われないため、標準のシステム・ヘッダを抑止しても問題は起こらないはずです。
CMA解析の特定の部分を重要視する場合は、-qオプションを使用してユーザ・ディレクトリを抑止しないことをお勧めします。また、同じ理由により、プロジェクトから特定の部分を取り除かないことも重要です。

※クロスモジュール解析(CMA)の詳細に関してはこちらをご覧ください。

回答を閉じる

QQA·C/QA·C++のコマンドライン実行に関する詳しい情報はどこにありますか? QA C8.1.1J以下/QA C++3.0J以下

FAQ ID:19

A
この情報は、QA·C/QA·C++インストールのhelp/pdf/ディレクトリにある、製品ユーザ・ガイドの第9章に記述されています。

なお、保守ユーザ様向けに弊社HPにて東陽ユーティリティというツールを提供しております。 東陽ユーティリティは、解析結果の警告一覧をCSVに生成することができます。

- ご利用方法 -
はじめは、東陽ユーティリティ利用手順書 ( ..\TOYO_UTIL\doc\Readme.pdf ) の6章"東陽ユーティリティの典型的な利用シナリオ"に従って QA C に同梱されているサンプルプログラムを出力することをお勧めいたします。

- 東陽ユーティリティダウンロード先 -http://www.toyo.co.jp/html/ss/qac/user/pwd_lock/maintenance/
+QA・C/QA・C++解析支援ツールなど
 ++東陽ユーティリティ (Windows用)

回答を閉じる

QWindows版のQA·C/QA·C++の解析結果を、Solaris/HP-UX/Linux版のQA·C/QA·C++で参照することはできますか?

FAQ ID:9

A
Windows版のQA·C/QA·C++が生成した結果(*.errや*.met)には、 Windowsの絶対パスの情報が含まれているため、 Solaris/HP-UX/Linux版のQA·C/QA·C++で参照することはできません。

回答を閉じる

Q静的解析を掛けた後のメトリックスの結果でSTM29(他の関数から呼び出された回数)という項目がありますが、他の関数からコールされているにもかかわらず" 0 "となっている結果があります。なぜですか?

A
QAC の解析は、大きくは個々のファイルについての解析と、プロジェクト全体についての解析に分けられます。プロジェクト全体についての解析は、クロスモジュール解析(CMA)と呼びます。STM29(他の関数から呼び出された回数) を計測するにはプロジェクト全体を確認する必要がありますので、STM29 は CMA で計測されます。他の関数からコールされているにもかかわらずSTM29 の項目が" 0 "となっている結果がある場合、以下の2つの原因が考えられます。

- 想定される原因
1.クロスモジュール解析(CMA)が実行されていない
※CMA は [解析] > [クロスモジュール解析] > [実行] で実施します。
※[解析] > [クロスモジュール解析] > [プロジェクトの解析時にCMAを実行] を選択すると、 [解析] > [プロジェクトの解析(CMA付き)] から、個々のファイルから CMA までの解析を一度に実施することができます。

2.クロスモジュール解析(CMA) の前に個々のファイルについての解析でエラーが発生している

※クロスモジュール解析(CMA)については、こちらをご覧ください

回答を閉じる

Qデータフロー解析(DFA)とはなんですか?

A
データフロー解析(DFA)は、関数内で変数がとり得る値の範囲や、 if 文等の分岐による処理の流れを考慮した解析で以下のような問題点を検出します。 また、QA・C/QA・C++では、一部のメトリックスの計測がDFAの実施を必要とします。 [DFAで検出される問題点] ・配列の領域外アクセス ・ゼロ除算 ・NULLポインタアクセス ・オーバーフロー ・値が設定されていない変数の使用 ・常に「真」または「偽」になる式 ・到達不能なコード ・無限ループ ・別々のオブジェクトを指すポインタ同士の比較 ・別々のオブジェクトを指すポインタ同士の差 ・過剰な右または左シフト ・return文が欠落しているコード ・負の値を符号なし型に代入しているコード ・冗長な代入式 など DFAはQA・C 6.2J、QA・C++ 3.0J で導入され、バージョンアップと共に改良されてきております。特に QA・C では QA・C 8.0J において大幅に改良されました。これに伴って QA・C 8.0J 以降では、DFA によって検出される警告メッセージが変更になっています。 QA・C 7.2.3J 以前のバージョンではDFAは常に実施されていましたが、QA・C 8.0J 以降および、QA・C++ では DFA は標準状態では実施しない設定になっておりますのでご注意下さい。

回答を閉じる

QQA·C/QA·C++がソースファイルを解析できないケースはありますか?

FAQ ID:5

A
QA·Cの場合は、『ISO C標準規格を逸脱したコンパイラ独自の拡張機能』が 使われているとき、QA·C++の場合は、『ISO C++標準規格を逸脱した コンパイラ独自の拡張機能』が使われているときに、「標準状態の まま」では文法エラーが発生して解析できないことがあります。

また、ソースファイルから #include によってインクルードされて いるヘッダファイルが見つからない場合や、ソースファイルの中に コンパイラ独自の予約語(__interrupt, __attribute__ など)が 記述されている場合、アセンブラコードが記述されている 場合などにも「標準状態のまま」では文法エラーが発生して解析 できないことがあります。

このような状態になった場合は、QA·CまたはQA·C++に解析 オプションを設定するなどして、「標準状態」を変更し、 文法エラーを解消する必要があります。
いくつかのコンパイラについては、QA·C/QA·C++の開発元である Programming Research社や、弊社が準備した設定ファイルが ありますので、文法エラーが発生してお困りの場合は、まず 技術サポート宛にお問い合わせ ください。

なお、QA·C/QA·C++は、バージョンが上がる度にコンパイラ独自の 拡張機能への対応を充実させています。最新のバージョンに移行 して頂くことで、特別な設定なしで解析できるようになるものも あります。

回答を閉じる

QQA·C/QA·C++のリリース情報を教えてください。

FAQ ID:1

A
最新版のQA·C/QA·C++に関する情報は、次のページをご確認ください。
 

回答を閉じる

Q「常に直接初期化を使用する(-audi+)」オプションの設定基準を教えてください。 QAC++2.1J以上

FAQ ID:9

A
コンパイラの中には、'T x = e;'という形式でクラスを 宣言した場合に、'T x(e);' と記述されたものと見なして 初期化するものと、'T x; x = e;' と記述されたものと 見なして初期化するものがあります。

お使いのコンパイラが、前者の挙動をする場合は、 「常に直接初期化を使用する(-audi+)」オプション を設定する必要があります。後者の場合は、デフォルト(-audi-)のままにします。

具体的には、お使いのコンパイラが次のソースコードをエラーなく コンパイルできる場合は、-audi+オプションを設定する必要があります。 // Error ==> -audi- (default) // Success ==> -audi+ class A{}; class B { public: B(const A&) {} }; class C { public: C(const B&) {} }; void foo() { A c1; C c2 = c1; // Problem } int main(void) { return 0; }なお、設定方法は次の通りです。

GUIから設定する場合:
  [コンパイラ パーソナリティ] の [拡張] タブで
  [常に直接初期化を使用する]
  チェックボックスを選択します。

設定ファイルを直接編集する場合:
  -audi+ と記述します。

回答を閉じる

QMicrosoft Vista上でQA·C/QA·C++を実行しているのですが、オンライン・ヘルプを表示させるにはどうすればよいでしょうか?

FAQ ID:20

A
XP以前のWindowsには標準のWindowsヘルプ・プログラムであるwinhlp32.exeが含まれていましたが、Vistaには含まれていません。
しかし、以下のリンクからVista用プログラムをダウンロードできます。

http://www.microsoft.com/downloads/details.aspx?displaylang=ja&FamilyID=6ebcfad9-d3f5-4365-8070-334cd175d4bb

回答を閉じる

Q自分のコードがISO標準規格に準拠していることをチェックするには? QA·C6.2J以上

FAQ ID:18

A
メッセージ・パーソナリティを編集して、レベル8(言語の制約)、レベル7(未定義の動作)、およびレベル6(移植性)の処理系定義のグループに焦点を絞 るようにします。レベル6より下のすべてのレベルを無効にし、レベル6の上記以外のグループのメッセージも無効にして、完全にこれらの問題に絞込みます。 (必要に応じてレベル6の「言語拡張」グループを含めることも可能です。)このパーソナリティを"compliance_only.p_s"のような名前 で保存しておき、将来的に設定を元に戻して有効なメッセージのより広範な構成を使用できるようにします。

MISRAコンプライアンス・モジュールを使用することにより、さらに焦点を絞り込んだサブセットを適用できます。MISRAルール1は、すべてのコード がISO規格に準拠すべきであると表明しています。ISO準拠のさまざまな側面を報告するメッセージは多数あるため、これらはすべて上のレベルに保持され ます。MISRAルール1に示されているISO準拠検証に絞り込むための簡単な方法は、MISRAメッセージ・パーソナリティ(mcm.p_sまたは m2cm.p_s)を編集して、レベル4のすべてのメッセージを無効にした後、ルール1を選択してそれらのメッセージを再び有効にすることです。結果とし て得られるレベル4およびレベル7、8の診断は、ルール1に含まれるISO準拠に関する問題だけに絞られます。

回答を閉じる

QCMA解析(クロスモジュール解析)の対象範囲はどう設定すればいいのでしょうか。 QA·C6.2J上/QA·C++2.1J以上

FAQ ID:16

A

CMA解析 (クロスモジュール解析) は、EXEや DLLを作成するためにリンクする ファイル同士に対して行うようにしてください。

QA·C/QA·C++は、EXE ファイルを作成する場合と同じイメージでご利用いただく ことを想定して設計されています。 具体的には、次の通りの対応関係になっています。

コンパイラ <--> qac.exe /qacpp.exe (一次解析)
リンカ <--> pal.exe (CMA解析)

リンク関係のないソースファイル同士に対して CMA解析を行うと、 同名の外部変数や関数が存在するといった警告が間違って表示されたり、 解析時間が長くなってしまったりすることがありますので推奨できません。

回答を閉じる

Q変数や関数を別ソースファイル内で使用しているのに、警告1500~1503の「このプロジェクトでは使用されていません。 」が検出されます。 QA·C6.2J上/QA·C++2.1J以上

FAQ ID:15

A

ソースファイルのあるディレクトリ、もしくはその親ディレクトリの 解析出力を抑止していないかご確認ください。

インクルードするヘッダファイルのディレクトリをコンパイラ・パーソナリティ (*.p_c) や アナライザ・パーソナリティ (*.p_a) に登録するとき、 ヘッダファイル内の問題について、検出しないよう、-q オプションを併せて 指定することができます。 このオプションを指定すると、ヘッダの警告を非表示にするだけでなく、 qac.exe や qacpp.exe は、このディレクトリにあるファイル間の関係に関する 解析を行いません (.err ファイルへの警告メッセージの生成及び、 .met ファイルへのメトリックスの生成を行いません)。
そのため、ソースファイルのあるディレクトリ、もしくはその親ディレクトリ に対して -q オプションを指定すると、CMA(クロスモジュール解析) の解析結果を 抑止してしまい、変数や関数を他ソースファイル内で使用しているにもかかわらず、 「このプロジェクトでは使用されていません。 」が検出されてしまいます。

この問題を回避するには、*.p_c や *.p_a 内の、これらディレクトリに対する -q オプションを削除してください。 そして、ヘッダファイルを個別に抑止するようにしてください。
例 (QA·C の*.p_c・*.p_a もしくは QA·C++ の*.p_a):
-i c:\work\src
-q c:\work\src\a.h

GUI 上で修正を行うには、コンパイラ・パーソナリティ・ダイアログの 「システム・ヘッダ」タブもしくは、アナライザ・パーソナリティ・ダイアログの 「プロジェクト・ヘッダ」タブ内で、ソースファイルのあるディレクトリや その親ディレクトリに対する抑止のチェックをはずし、新たにヘッダファイルの 追加を [追加] ボタンから行ってください。

プロジェクトで使用しているパーソナリティを表示・編集する方法は、 「QA·C/QA·C++のGUIプロジェクトに設定されているパーソナリティ・ファイルの内容を参照・編集する方法と参照先パスを変更する方法を教えてください。(Windows版)」 を参照してください。

回答を閉じる

QQA·C/QA·C++プロジェクトを作成、解析する時、ヘッダファイルもQA·C/QA·C++プロジェクトに含めなければなりませんか。

FAQ ID:14

A
ヘッダファイルは、ソースファイル(*.c や *.cppなど) に インクルードされていると、そのファイルを解析するときに あわせて解析されます。そのため、ヘッダファイルを明示的にQA·C/QA·C++プロジェクトに 追加する必要はありません。

ヘッダ・ファイルの解析結果を表示したいときは、 コンパイラ・パーソナリティの「システム・ヘッダ」タブや、 アナライザ・パーソナリティの「プロジェクト・ヘッダ」タブ上で、 結果を表示したいヘッダファイルディレクトリの「出力を抑制する」チェックを はずしてください。 また、メッセージ・パーソナリティの「表示」タブで、 「ヘッダ中の警告を表示する」にチェックを入れてください。

回答を閉じる

Qヘルプの内容をユーザが変更することは出来ますか?

FAQ ID:13

A
QA·C/QA·C++はヘルプの内容を変更する機能を備えていません。
しかし、メッセージ番号に対応するヘルプなどはHTMLファイル ですので、テキストエディタなどで編集して内容を変更する ことはできます。
ただし、内容を変更したことによって引き起こされた不具合に ついてはサポート対象外になります。

回答を閉じる

Q警告メッセージの文章をユーザが変更することはできますか?

FAQ ID:12

A
ユーザ・メッセージ・ファイルを作成すれば、警告メッセージの文章を変更することができます。

QA·Cの場合の具体的な手順は次の通りです。
  • ユーザ・メッセージ・ファイル用に、内容が空のファイルを作成し、qac.usr.ex のように命名します。(末尾の拡張子 .ex は別の名称でも構いません。例えば、qac.usr.aaa でもOKです)
  • QA·Cのオリジナルのメッセージファイル(bin ディレクトリ配下の qac.msg)をテキストエディタで開きます。
  • qac.msg から文章を変更したいメッセージを検索します。(ここでは、2001番のメッセージの文章を変更することにします)
  • 2001番のメッセージの行を qac.msg から qac.usr.ex にコピーします。(メッセージ番号に対応する文章は一行だけとは限りません。「\\」が末尾に付いている場合は次の行も文章の一部になるので注意してください)
  • qac.usr.ex にコピーされた文章を変更します。
  • 他の番号のメッセージの文章も変更する場合は、3~5を繰り返します。
  • ここまでで、ユーザ・メッセージ・ファイルの作成は完了しました。
    後は、QA·Cに qac.usr.ex を使うための設定を施します。
  • メッセージ・パーソナリティの編集画面を開きます。
  • 「拡張設定」タブを開きます。
  • 「ユーザ・メッセージ・ファイル」部の「ブラウズ」ボタンを押して、上記で 作成した qac.usr.ex を選択します。
    ※ メッセージ・パーソナリティをテキストエディタを使って直接編集する場合は、-up オプションと -usr オプションを次のように追記してください。
    ※ qac.usr.ex が C:\TEST に置かれているものとします。
    ※ -usrオプションには、qac.usr.ex の拡張子を記述します。
    例:
     -up "C:\TEST\"
     -usr .ex
  • これですべての準備が整いました。
    ソースファイルを解析し、解析結果に現れる2001番のメッセージの文章が変わっていることを確認してください。
  • ※ QA·C++の場合は、qac.usr.ex を qacpp.usr.ex、qac.msg を qacpp.msg に
      読み替えてください。
    ※ より詳細な解説は、ユーザーズガイドの「ユーザ・メッセージ・ファイル」
      をご参照ください。

    回答を閉じる