コードの分析
組み込みのコード分析ツールを使用して、静的コード解析の実行、メモリリークの検出、CPUおよびメモリ使用状況のプロファイリング、コードカバレッジの確認、トレースイベントの可視化を行います。
コード解析ツールの使用
コード解析ツールを使用するには、[Analyze ] メニュー、または [
] (Start Debugging of Startup Project) ボタンのプルダウンメニューからツールを選択します。[Debug ] モードでは、デバッガーツールバーのメニューからツールを選択して切り替えます。

「Debug 」モードでは、ビューを画面上の新しい位置にドラッグして配置できます。ビューのサイズと位置は、次回のセッションのために保存されます。ビューを元のサイズと位置にリセットするには、「View 」>「Views 」>「Reset to Default Layout 」を選択します。
コード解析ツールの概要
次の表は、Qt Creator でコードを分析するために使用できるコード分析ツールについて説明しています。一部のツールはQt Creator に組み込まれていますが、その他のツールはコンピュータに個別にインストールするか、サーバーから実行することができます。
| ツール | 言語 | 利用状況 | 説明 |
|---|---|---|---|
| Axivion Suite | C、C++、C# | Axivionサーバーが必要 | コード、アーキテクチャ、依存関係、メトリクス、およびコーディングガイドラインを分析します。 |
| Clang-Tidy および Clazy | C、C++、Objective-C | 組み込み | スタイル違反、インターフェースの誤用、および Qt 固有の問題の診断を行い、修正を適用します。 |
| Chrome Trace Format Visualizer | 任意 | 組み込み | Chrome Trace Formatでサードパーティ製ツールによって生成されたトレースを調査します。 |
| Coco | C、C++、C#、QML、Tcl | インストールが必要 | 未テストのコード、冗長なテスト、およびデッドコードを検出します。 |
| Cppcheck | C, C++ | インストールが必要 | アプリケーションを実行することなく、CおよびC++コード内の未定義の挙動や危険なコーディング構造を検出します。 |
| Heob | 任意 | インストールが必要 (Windows) | Windows上でメモリリークやバッファオーバーランを検出します。 |
| Performance Analyzer | 任意 | 標準搭載(Linux) | Linuxデスクトップおよび組み込みデバイス上のアプリケーションのCPUおよびメモリ使用状況を分析します。 |
| QML Profiler | QML、JavaScript | 標準搭載 | アプリケーションにおける動作の遅さや応答の遅れなど、典型的なパフォーマンス問題の原因を特定します。 |
| QMLおよびJavaScriptの静的解析 | QML、JavaScript | 標準機能 | 構文エラー、プロパティの欠落、型の不一致など、コード内の一般的な問題を見つけ出します。 |
| Valgrind | 任意 | インストールが必要(Linux、macOS 10.9~11.0、Intel のみ) | メモリリーク、メモリエラー、スレッド関連の問題を検出します。 |
CおよびC++の静的解析
Axivion Suite
Axivion Suiteは、アーキテクチャの一貫性を追跡し、チーム全体のコーディングガイドラインを徹底させ、連続するビルドにわたる品質の傾向を測定する、エンタープライズグレードのソフトウェア品質スイートです。C、C++、およびC#に対応しています。
Axivion Suite を使用すると、以下のことが可能です:
- ソースコードをチェックして、潜在的な実行時エラーを検出します。
- メトリクスを用いて、ソースコードの内部品質に関する定量的な情報を生成します。
- スタイルチェックを実行し、コーディングガイドラインへの準拠を実現します。
- ソースコード内の重複コードおよび類似コードを検出します。
- さまざまなレベルでの循環依存関係を特定します。
- 到達不可能なコードを検出します。
Axivion Suite をインストールし、Qt Creator で Axivion プラグインを有効にすると、違反、メトリクス、インライン注釈などの分析結果を表示できます。
詳細については、以下を参照してください:
Clang-Tidy および Clazy
Qt Creator には、C、C++、および Objective-C コード向けの相互補完的な静的解析ツールであるClang-TidyおよびClazy に対する組み込みサポートが含まれています。デフォルトでは、編集中に開いているファイルの診断結果がリアルタイムで表示されます。これにより、別途ビルド工程を待つことなく、コードの品質と一貫性を維持できます。
Clang-Tidyは、スタイル違反、インターフェースの誤用、バグになりやすいパターンなど、典型的なプログラミングエラーをチェックします。また、検出した問題の多くに対して、古いC++コードの近代化を含め、自動修正機能も提供します。
Clazyは、Clangの診断機能に加えて、Qt固有のチェック機能を追加します。その範囲は、不要なメモリ割り当てからQt APIの誤用まで多岐にわたります。また、Clazyは検出した問題の一部を修正するためのリファクタリングアクションも提供します。
詳細については、以下を参照してください:
Cppcheck
Cppcheckは、CおよびC++コードにおける未定義の挙動や危険なコーディング構造を検出することに重点を置いた、軽量な静的解析ツールです。アプリケーションをビルドしたり実行したりすることなく、ソースコードを解析します。
Cppcheckは、配列の境界外アクセス、ヌルポインタの参照、初期化されていない変数の使用、リソースリーク、不審な整数演算など、幅広い問題を検出します。チェック項目の完全なリストについては、「Cppcheck: チェック項目のリスト」を参照してください。
Cppcheckを別途インストールし、Qt Creator でCppcheckプラグインを有効にすることで、分析結果を統合できます。Cppcheckは開いているファイルに対して自動的に実行されますが、Analyze >Cppcheck から選択したファイルに対して手動で実行することも可能です。
詳細については、「Cppcheck を使用した C++ コードのエラー検出」を参照してください。
QML および JavaScript
QML および JavaScript の静的チェック
組み込みの静的解析ツールを使用すると、JSLint を使用する場合と同様に、プロジェクト内の QML および JavaScript コードに対して静的チェックを実行し、一般的な問題を見つけることができます。
このチェックでは、アプリケーションを実行することなく、構文エラー、プロパティの欠落やスペルミス、型の不一致、その他の一般的なミスを検出できます。
詳細については、「JavaScript および QML のチェック」を参照してください。
QML Profiler
Qt Creator QML Profiler が付属しており、QML コードの実行時のバインディング評価やシグナル処理を検査できます。これを使用すると、コードの検査だけでは発見が難しいパフォーマンスのボトルネックを特定できます。
QML Profiler は、シグナル処理、バインディングの評価、JavaScriptの実行などのイベントを記録し、タイムラインビューで可視化します。これは、動作の遅延や応答の遅れを診断するのに役立ちます。
詳細については、以下を参照してください:
メモリ分析
Valgrind
ValgrindのツールスイートからMemcheckとCallgrindをインストールし、Qt Creator でValgrindプラグインを有効にすることで、LinuxおよびmacOS(10.9~11.0、Intelのみ)上でメモリエラーの検出や関数実行のプロファイリングを行うことができます。これらのツールは、任意の開発ホストからリモートのLinuxマシンやデバイス上で実行可能です。
Memcheckは、解放済みのメモリへの読み取りや書き込み、初期化されていないメモリの使用、メモリリーク、割り当て関数の誤った使用など、メモリ管理上の問題を発見します。Callgrindは、関数の呼び出し履歴とキャッシュ使用統計を記録します。
Valgrindツールは、開発ホスト上でローカルに実行することも、別のホスト上でリモートに実行することもできます。これらのツールを使用して、Qt Creator でプロジェクトを設定したアプリケーションと、プロジェクトがないアプリケーションの両方を分析できます。
プロジェクトが設定されているアプリケーションを分析するために Valgrind ツールを実行するには、Qt Creator でそのプロジェクトを開き、プロジェクトを実行するキットを選択します。キットによって、Valgrind ツールをローカルで実行するかリモートで実行するかが指定されます。
Valgrind ツールの設定を行うには、Preferences から「Analyzer 」>「Valgrind 」を選択します。各プロジェクトの「Run Settings 」では、一般的な設定を上書きすることができます。
詳細については、以下を参照してください:
- Valgrind Memcheck
- Valgrind Callgrind
- Memcheck を使用したメモリリークの検出
- 外部アプリケーションで Valgrind ツールを実行する
- プロジェクトに対する Valgrind の設定を指定する
Heob
Windows では、バッファオーバーランやメモリリークを検出するために、Heob ヒープオブザーバーをインストールします。
Heobは、バッファオーバーランが発生するとアクセス違反を発生させ、問題となった命令およびバッファ割り当てのスタックトレースを記録します。Heobが正常に終了した後、結果を確認できます。
詳細については、以下を参照してください:
プロファイリングとトレース
パフォーマンスアナライザー
Linux では、Performance Analyzer を使用して、Linux デスクトップおよび組み込みデバイス上のアプリケーションの CPU およびメモリ使用状況を分析します。
Performance Analyzer は、Linux カーネルに同梱されている Perf ツールを使用して、アプリケーションのコールチェーンのスナップショットを定期的に取得し、タイムラインビューまたはフレームグラフとして可視化します。
詳細については、「パフォーマンスアナライザー」を参照してください。
Chrome トレース形式ビジュアライザー
Chrome Trace Format Visualizer を使用すると、Chrome トレースイベントを表示できます。これは、組み込みのトレースビューア (chrome://tracing) では視覚化が難しい大規模なトレースファイルを表示する際に特に役立ちます。
Chrome ベースのツール以外にも、Chrome トレース形式で Chrome トレースイベントに関する情報を生成できるトレースツールがいくつかあります。このビジュアライザーを使用すると、トレース内のイベントをナビゲート、ズーム、および検査することができます。
詳細については、以下を参照してください:
コードカバレッジ
Coco
Coco コードカバレッジツールチェーンをインストールし、Qt Creator で C、C++、C#、QML、および Tcl プログラム用の Coco プラグインを有効にしてください。たとえば、テストスイートの一環として、アプリケーションの実行状況を分析するために使用できます。その結果を活用して、テストの効率化と網羅性の向上を図ることができます。
以下のことが可能です:
- テストされていないコードセクションを特定する。
- 削除可能な冗長なテストを特定する。Cocoは、テストによってカバレッジが確保されているソースコードの部分を特定できます。また、新しいテストが、既存のテストではカバーされていないソースコードの行をカバーしているかどうかを検出することもできます。
- 実行されないコードを表示することで、デッドコードを特定します。
- 各実行におけるテストカバレッジを最大化するための最適なテスト実行順序を算出します。これは特に手動テストにおいて有用です。
- アプリケーションの2つの別々のバージョンを分析し、その違いを比較します。これにより、ソースコードの変更によってどのテストが影響を受けるかを確認できるほか、パッチやホットフィックスのテストカバレッジをある程度把握することも可能です。
- アプリケーションおよびテストの実行時間を測定します。
詳細については、以下を参照してください:
関連項目: プロジェクトのキットの有効化、手順:分析、アナライザ、およびプラグインの有効化と無効化。
Copyright © The Qt Company Ltd. and other contributors. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.