cppcheck の使い方

Cppcheck は、無料で使える C および C++ プログラミング言語用の静的コード分析ツールです。作成者兼主任開発者は Daniel Marjamäki です。 Cppcheckは、GNU General Public License に基づくフリーソフトウェアです。

本ページでは、cppcheck の使い方などについて記載してみたいと思います。

 

 

 

1. インストール

 

1-1. Windows

Windows 環境へインストールする手順について記載します。

 

1. 下記ULRからインストーラーを入手します。

Cppcheck - A tool for static C/C++ code analysis (sourceforge.io)

 

本ページ記載時のバージョンは 2.12 でした。

インストーラーを取得

 

 

2. インストーラーを実行します。

デフォルトで問題ありません。必要に応じて、インストール場所の変更、"Python addons" の追加、等を行います。

 

インストーラー画面1

 

インストーラー画面2

 

インストーラー画面3

 

インストーラー画面4

 

以上でインストール完了です。

 

 

1-2. Linux

cppcheck は様々なパッケージマネージャーからインストール可能です。使用されている Linux 環境に従って下記コマンドを実行します。

 

Devian / Ubuntu

sudo apt-get install cppcheck

 

Fedrea

sudo yum install cppcheck

 

Mac

brew install cppcheck

 


 

2. 使用方法

 

2-1. GUI (Windows)

GUI 版の使用方法について記載します。

 

1. cppcheck を起動します。

最初から日本語で表示してくれました。

cppcheck 起動直後の画面

 

2. メニューの [ファイル(F)] → [新規プロジェクト(N)...] でプロジェクトを作成します。

新規プロジェクト(N) 作成

 

ファイルダイアログが表示されるので、保存するプロジェクトファイルのファイル名を指定します。

その後、プロジェクトの設定画面(下図)が出てくるので、「パス」 に解析を行うソースファイルの場所を設定します。

プロジェクトを設定

 

「インクルードパス」には boost など外部ライブラリーのヘッダー所在を指定します。指定しなくてもチェックできるようですが、指定した方がより良い解析結果を出力してくれるようです。

 

解析対象から除外するファイルは下記画面中の「除外するソースファイル」へ登録することで行います。

除外するファイル、の設定

 

これらのプロジェクトの設定を後から修正したい場合は [プロジェクトの編集(E)] のメニューを選ぶことでと同じダイアログを表示できます。

 

3. 下記のようなテストプログラムを作成し、これを cppcheck で解析してみます。

[test.cpp]

#include <iostream>

void foo(int x)
{
    int buf[10];
    if (x == 1000){
        buf[x] = 0; // <- ERROR
    }
}

int main()
{
    foo(1000);
    return EXIT_SUCCESS;
}

 

プロジェクトの新規作成後に [OK] でダイアログを閉じたり、プロジェクトを開くとチェックが始ります。 または「全ファイル再解析(y)」ボタンをクリックすることでも解析を実施してくれます。

解析結果は以下の通りです。ERROR の場所を「Array indel out of bounds.」とちゃんと検出してくれました。

解析結果

 

 

 

2-2. CUI

CUI 版の使用方法について記載します。

Jenkins や Pipelines などの各種 CI/CD ツールと連携させたい場合などでは CUI(コマンドライン) を使って解析します。

 

概要

CUI は次の形式で実行します。

$ cppcheck --enable=all ソース [...]

引数としてチェック対象のソースファイルやファイルのあるフォルダーを指定します。フォルダーの場合は再帰的にチェックします。

GUI の結果をみるとわかりやすいと思いますが、 cppcheck の検査項目はカテゴリー分けされています。--enable オプションでそのカテゴリーを指定し、all ですべてのカテゴリーが検査対象となります。--enable を指定していないと検査項目が何もないことになるので、 とりあえず all をつけて使い始め、慣れてきたら必要とする検査項目のみに限定してはいかがでしょうか。

 

"--enable" オプションで指定できるパラメータは以下の通りです。

[Table.] "--enable" オプションで指定できるパラメータ
パラメータ 説明
all 全てのチェックを有効にします。

(例) cppcheck  --enable=all  file.c

warning warning のチェックを有効にします。
style style を指定すると warning, performance, portability, style のチェックを有効にします。
performance performance のチェックを有効にします。
portability portability のチェックを有効にします。
information information のチェックを有効にします。
unusedFunction unusedFunction のチェックを有効にします。
missingInclude missingInclude のチェックを有効にします。

 

パラメータを複数組み合わせて指定する場合、以下のようにカンマ区切りで併記します。

cppcheck --enable=warning,performance file.c

 

注意

unusedFunction チェックは、関数が呼び出されなかったときに警告するチェックなので、プログラム全体をチェックするときのみ "--enable=unusedFunction", "--enable=all" を使用することを推奨します。関数呼び出しがチェック範囲にみつからなかった、という警告を不要に出力する可能性が高くなるからです。

 

 

[Table.] その他 よく使用するオプション
オプション 機能
-h, --help ヘルプ表示
-q, --quiet ログを出さない(解析結果だけ表示)
-I インクルードフォルダーのパスを指定
-D define を指定
-i 除外するファイルやフォルダーの指定
--xml 解析結果の出力を xml 形式にする
--platform 適用する c/c++ 標準を指定する
  • unix32: 32 bit unix variant
  • unix64: 64 bit unix variant
  • win32A: 32 bit Windows ASCII charactor encoding
  • win32W: 32 bit Windows UNICODE charactor encoding
  • win64: 64 bit Windows
  • avr8: 8 bit AVR microcontrollers
  • elbrus-e1cp: Elbrus e1c+ architecture
  • pic8: 8bit PIC microcontrollers
  • pic8-enhanced:
  • pic16: 16 bit PIC microcontrollers
  • mips32: 32 bit MIPS microcontrollers
  • native: Type sizes of host system are assumed, but no further assumptions.
  • unspecified: Unknown type sizes

(例) --platform=unix64

--std 適用する c/c++ 標準を指定する
  • c89
  • c99
  • c11
  • c++03
  • c++11
  • c++14
  • c++17
  • c++20

(例) --std=c++20

 

 

解析してみる

GUI と同じ下記テストコードを解析してみます。

 

[test.cpp]

#include <iostream>

void foo(int x)
{
    int buf[10];
    if (x == 1000){
        buf[x] = 0; // <- ERROR
    }
}

int main()
{
    foo(1000);
    return EXIT_SUCCESS;
}

 

下記コマンドで解析します。Windows の場合は事前に path を登録して cppcheck を使えるようにしておいてください。

$ cppcheck --enable=all --suppress=missingIncludeSystem --platform=win64 --std=c++20 test.cpp

 

実行結果は以下の通りです。

C:\Users\foo\Documents\cpp\cppcheck_test>cppcheck --enable=all --suppress=missingIncludeSystem --platform=win64 --std=c++20 test.cpp
Checking test.cpp ...
test.cpp:7:12: warning: Either the condition 'x==1000' is redundant or the array 'buf[10]' is accessed at index 1000, which is out of bounds. [arrayIndexOutOfBoundsCond]
        buf[x] = 0; // <- ERROR
           ^
test.cpp:6:11: note: Assuming that condition 'x==1000' is not redundant
    if (x == 1000){
          ^
test.cpp:7:12: note: Array index out of bounds
        buf[x] = 0; // <- ERROR
           ^
test.cpp:5:9: style: The scope of the variable 'buf' can be reduced. [variableScope]
    int buf[10];
        ^
test.cpp:7:16: style: Variable 'buf[x]' is assigned a value that is never used. [unreadVariable]
        buf[x] = 0; // <- ERROR
               ^
Active checkers: 163/565

C:\Users\foo\Documents\cpp\cppcheck_test>

 

GUI 版と同じ解析結果を出力できていることを確認できました。

 


 

3. 解析結果の例

 

3-1. 例1

 

 

3-2. 例2

 

 


 

ライセンス

本ページの情報は、特記無い限り下記 MIT ライセンスで提供されます。

The MIT License (MIT)

  Copyright 2023 Kinoshita Hidetoshi

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

 

 

参考

 


 

記載

2023-12-21 - 新規作成

 

Programming Items トップページ

プライバシーポリシー