静的解析,構成管理,MISRA-C,コードレビュー,バグトラッキング,リバースエンジニアリング
ソフトウエア開発支援ツール
  SOFTWARE SOLUTIONS
 ソフトウェア開発における品質の向上、および生産性の向上を目指して、最適な開発支援ツールを提供します。
ソフトウエア開発支援ツール > 製品紹介 > 静的解析ツール QAC++ > 技術情報 > よくある質問 (FAQ) > QA C/QA C++に関するFAQ
QA C/QA C++に関するFAQ
質問1. QAC/QAC++のリリース情報を教えてください。 戻る
回答1. 最新版のQAC/QAC++に関する情報は、次のページをご確認ください。
  • QACのリリース情報
  • QAC++のリリース情報

  • 質問2. CとC++のコードが混在している場合、QACとQAC++のどちらで解析すればよいのでしょうか? 戻る
    回答2. ソースファイルの拡張子が .c の場合はQAC、拡張子が .cpp (または .C など) の場合はQAC++で解析してください(理由は後述の説明をご参照ください)。

    皆様がソフトウェア開発でお使いになっているC/C++コンパイラは、次の2種類のコンパイル手段を備えています。
    1. C言語モードでコンパイルする手段
    2. C++言語モードでコンパイルする手段
    コンパイル手段を切り替える方法は、コンパイラスイートごとに異なり、
    1. 呼び出すコンパイラのコマンド自体を切り替える
    2. コンパイラに与えるオプションを切り替える
    3. コンパイラが拡張子を判別して自動的に切り替える
    といった方法が用いられています。

    これらの切り替えは、コンパイルするソースファイルごとに行われます。つまり、ある一つのソースファイルはその内容に関わらず、必ずC言語モードとC++言語モードのどちらか一方でコンパイルされます。
    言い換えると、ある一つのソースファイルの中には、(プリプロセッサを通した状態で)C言語に従った構文とC++言語に従った構文のどちらか一方だけしか記述できないということになります。

    「C言語と高い互換性をもつ構文」をC++言語モードでコンパイルされるソースコードの中に記述することはできます。その意味では、「CとC++のコードが混在している」ソースファイルを記述するという表現をすることはできます。
    しかし、この場合に記述できるのはあくまでも『C++言語に従った「C言語と高い互換性をもつ構文」』であって、『C言語に従った構文』ではありません。厳密に言えば「CとC++のコードが混在している」ソースファイルを記述することはできないということになります。

    皆様が開発しているアプリケーションの各ソースファイルには、 .c や .cpp (または .C )といった拡張子が付けられていると思います。通常、拡張子が .c の場合はC言語モード、拡張子が .cpp (または .C )の場合はC++言語モードでコンパイルされることを意図して開発されていて、お使いになっている統合開発環境の大半がこの前提で動作するようになってい るはずです。

    QAC/QAC++の開発元であるProgramming Research社は、QACをC言語モードに対応するC言語専用のツールQAC++をC++言語モードに対応するC++言語専用のツールに位置づけています。コンパイラや統合開発環境と同様にソースファイルの拡張子に従って、QACとQAC++のどちらを使って解析するのかを区別してください。

    質問3. C++言語で記述されたコードをQACで解析することはできないのでしょうか? 戻る
    回答3. 「CとC++のコードが混在している場合、 QACとQAC++のどちらで解析すればよいのでしょうか?」に記載させて頂いた とおり、QAC/QAC++の開発元であるProgramming Research社は、 QACをC言語モードに対応するC言語専用のツールに 位置づけています。

    解析対象のソースファイルの中に、C++言語固有のキーワードや文法が記述されて いなかったとしても、ソースファイルからインクルードされているヘッダファイル の中に、C++言語固有のキーワードや文法が記述されている場合、それらの 出現箇所で文法エラーが発生し、解析が中断してしまいます。
    例えば、C++言語ではクラスを定義することができますが、 C言語ではクラスを定義することはできません。

    このため、C++言語で記述されたコードを解析する場合は、姉妹品のQA C++をご利用ください。

    質問4. C言語で記述されたコードをQAC++で解析することはできないのでしょうか? 戻る
    回答4. 「CとC++のコードが混在している場合、 QACとQAC++のどちらで解析すればよいのでしょうか?」に記載させて頂いた とおり、QAC/QAC++の開発元であるProgramming Research社は、 QAC++をC++言語モードに対応するC++言語専用のツールに 位置づけています。

    解析対象のソースファイルの中に、C++言語で認められていないC言語固有の 文法が記述されていなかったとしても、ソースファイルからインクルード されているヘッダファイルの中に、C++言語で認められていないC言語固有の 文法が記述されている場合、それらの出現箇所で文法エラーが発生し、 解析が中断してしまいます。
    例えば、C言語では変数の型や関数の返却値の型を省略することが できますが、C++言語では型の省略は許されていません。

    このため、C言語で記述されたコードを解析する場合は、姉妹品のQA Cをご利用ください。

    質問5. QAC/QAC++がソースファイルを解析できないケースはありますか? 戻る
    回答5. QACの場合は、『ISO C標準規格を逸脱したコンパイラ独自の拡張機能』が 使われているとき、QAC++の場合は、『ISO C++標準規格を逸脱した コンパイラ独自の拡張機能』が使われているときに、「標準状態の まま」では文法エラーが発生して解析できないことがあります。

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

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

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

    質問6. QAC/QAC++がソースコードの解析漏れを起こすことはありませんか? 戻る
    回答6. QAC/QAC++がソースコードの解析漏れを起こすことはありません。
    より正確には、プリプロセスの過程で除去される部分以外の ソースコードに対してQAC/QAC++が解析漏れを起こすことはありません。

    プリプロセスの過程で除去される部分は解析されませんが、 この部分はもともと解析対象外であっただけで、 解析漏れを起こしているわけではありません。
    実際、コンパイラもプリプロセッサの過程で除去される 部分はコンパイルしません。

    具体的には、QAC/QAC++はコンパイラと同様に次の部分を解析対象にします。
    例:
    #define AAA /* 解析対象 */
    #define MAX(a,b) ((a)>(b)?(a):(b)) /* 解析対象 */

    #ifdef AAA /* 解析対象 */
    ... /* 解析対象 */
    #else /* 解析対象 */
    ... /* 解析対象外 */
    #endif /* 解析対象 */

    int main(void) { /* 解析対象 */
    return 0; /* 解析対象 */
    } /* 解析対象 */


    質問7. Solaris/HP-UX/Linuxで開発したソースコードを、Windows版のQAC/QAC++で 解析することはできますか?
    戻る
    回答7. コンパイルに必要なすべてのヘッダファイルとソースファイルを Windows環境にコピーして頂ければ解析することができます。
    ただし、オペレーティングシステム自体がそもそもサポートしていない 機能(特にファイルシステム関連の機能)を解決することは できませんので、次の点に注意する必要があります。
    1. Windowsはシンボリックリンクを扱うことができません。 同様にWindows版のQAC/QAC++もシンボリックリンクを扱うことが できません。
      このため、Windows版のQAC/QAC++で解析する場合は、 シンボリックリンクを 実際のファイルやディレクトリに置き換える必要があります。
    2. Windowsはファイル名やディレクトリ名の大文字/小文字 を区別しません。同様にQAC/QAC++も区別しません。
      このため、コピー前の同じディレクトリの中に大文字/小文字 のみが異なるファイルやディレクトリが存在する場合は、 それらを異なるディレクトリの中に分けてコピーする 必要があります。
    3. WindowsとSolaris/HP-UX/Linuxでは、絶対パスの表現方法 が異なります。#include文で指定したヘッダファイル名が 絶対パスで記述されている場合は、ヘッダファイルを見つける ことができなくなります。
      この場合は、絶対パスを相対パスに変更して、#include文 で指定したヘッダファイルが見つかるようにする必要が あります。
    4. WindowsとSolaris/HP-UX/Linuxでは、テキストファイルに 使用される標準の文字コードが異なることがあるので、 QAC/QAC++の解析結果を表示したときなどに結果が文字化けする ことがあります。
      この場合は、QAC/QAC++のエンコーディング(-en)オプションを、 解析対象のソースファイルで使用されている文字コードに 一致させて解析する必要があります。


    質問8. Windowsで開発したコードを、Solaris/HP-UX/Linux版のQAC/QAC++で解析する ことはできますか?
    戻る
    回答8. コンパイルに必要なすべてのヘッダファイルとソースファイルを Solaris/HP-UX/Linux環境にコピーして頂ければ解析することができます。
    ただし、オペレーティングシステム自体がそもそもサポートしていない 機能(特にファイルシステム関連の機能)を解決することは できませんので、次の点に注意する必要があります。
    1. Solaris/HP-UX/Linuxはファイル名やディレクトリ名の大文字/小文字 を区別します。同様にQAC/QAC++も区別します。
      このため、#include文で指定したヘッダファイル名が 大文字/小文字の違いも含めて、ファイルシステム上の ファイル名と一致しない場合に、ヘッダファイルを 見つけることができなくなります。
      このため、Solaris/HP-UX/Linux版のQAC/QAC++で解析 する場合は、ファイル名を変更するか、シンボリック リンクを作成して、#include文で指定したヘッダ ファイル名に一致するヘッダファイルが見つかる ようにする必要があります。
    2. Solaris/HP-UX/LinuxとWindowsでは、絶対パスの表現方法 が異なります。#include文で指定したヘッダファイル名が 絶対パスで記述されている場合は、ヘッダファイルを見つける ことができなくなります。
      この場合は、絶対パスを相対パスに変更して、#include文 で指定したヘッダファイルが見つかるようにする必要が あります。
    3. Solaris/HP-UX/LinuxとWindowsでは、テキストファイルに 使用される標準の文字コードが異なることがあるので、 QAC/QAC++の解析結果を表示したときなどに結果が文字化けする ことがあります。
      この場合は、QAC/QAC++のエンコーディング(-en)オプションを、 解析対象のソースファイルで使用されている文字コードに 一致させて解析する必要があります。


    質問9. Windows版のQAC/QAC++の解析結果を、Solaris/HP-UX/Linux版のQAC/QAC++で参照することはできますか? 戻る
    回答9. Windows版のQAC/QAC++が生成した結果(*.errや*.met)には、 Windowsの絶対パスの情報が含まれているため、 Solaris/HP-UX/Linux版のQAC/QAC++で参照することはできません。

    テキスト形式やHTML形式の注釈付きソースコードであれば、 テキストエディタやブラウザで参照することができますが、 HTML形式の注釈付きソースコードからハイパーリンクされて いるメッセージヘルプへジャンプすることはできません。

    質問10. Solaris/HP-UX/Linux版のQAC/QAC++の解析結果を、Windows版のQAC/QAC++で参照することはできますか? 戻る
    回答10. Solaris/HP-UX/Linux版のQAC/QAC++が生成した結果(*.errや*.met)には、 Solaris/HP-UX/Linuxの絶対パスの情報が含まれているため、 Windows版のQAC/QAC++で参照することはできません。

    テキスト形式やHTML形式の注釈付きソースコードであれば、 テキストエディタやブラウザで参照することができますが、 HTML形式の注釈付きソースコードからハイパーリンクされて いるメッセージヘルプへジャンプすることはできません。

    質問11. 旧バージョンのQAC/QAC++の解析結果を、新バージョンのQAC/QAC++で参照することはできますか? また、新バージョンのQAC/QAC++の解析結果を、旧バージョンのQAC/QAC++で参照することはできますか? 戻る
    回答11. バージョンごとに、警告番号などの解析情報が異なっています。 そのため、あるバージョンで生成した結果(*.errや*.met)を、別のバージョンで参照することはできません。

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

    テキスト形式やHTML形式の注釈付きソースコードであれば、異なるバージョンのQAC/QAC++がインストールされたマシン上でも参照することができます。 しかし、HTML形式の注釈付きソースコードからハイパーリンクされているメッセージヘルプへジャンプすることはできません。

    質問12. 警告メッセージの文章をユーザが変更することはできますか? 戻る
    回答12. ユーザ・メッセージ・ファイルを作成すれば、警告メッセージの文章を変更することができます。

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

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

    質問14. QAC/QAC++プロジェクトを作成、解析する時、ヘッダファイルもQAC/QAC++プロジェクトに含めなければなりませんか。 戻る
    回答14. ヘッダファイルは、ソースファイル(*.c や *.cppなど) に インクルードされていると、そのファイルを解析するときに あわせて解析されます。そのため、ヘッダファイルを明示的にQAC/QAC++プロジェクトに 追加する必要はありません。

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

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

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

    インクルードするヘッダファイルのディレクトリをコンパイラ・パーソナリティ (*.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版)」 を参照してください。



    質問16. CMA解析(クロスモジュール解析)の対象範囲はどう設定すればいいのでしょうか。 QAC6.2J上/QA C++2.1J以上 戻る
    回答16.

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

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

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

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

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

    質問18. 自分のコードがISO標準規格に準拠していることをチェックするには?
    QAC6.2J以上
    戻る
    回答18. メッセージ・パーソナリティを編集して、レベル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準拠に関する問題だけに絞られます。

    質問19. QAC/QAC++のコマンドライン実行に関する詳しい情報はどこにありますか? 戻る
    回答19. この情報は、QAC/QAC++インストールのhelp/pdf/ディレクトリにある、製品ユーザ・ガイドの第9章に記述されています。

    質問20. Microsoft Vista上でQAC/QAC++を実行しているのですが、オンライン・ヘルプを表示させるにはどうすればよいでしょうか? 戻る
    回答20. XP以前のWindowsには標準のWindowsヘルプ・プログラムであるwinhlp32.exeが含まれていましたが、Vistaには含まれていません。
    しかし、以下のリンクからVista用プログラムをダウンロードできます。

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