C LANGUAGE TECHNOLOGY

【C/C++言語】静的コード解析ツールと動的プログラム解析ツール

悩んでいる人

C/C++言語の静的コード解析ツールと動的プログラム解析ツールを教えて!

こういった悩みにお答えします.

本記事の信頼性

  • リアルタイムシステムの研究歴12年.
  • 東大教員の時に,英語でOSの授業.
  • 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校コンピュータサイエンス学部2021年の世界大学学術ランキングで20位)で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発
  • プログラミング歴15年以上,習得している言語: C/C++Solidity/Vyper,Java,Python,Ruby,HTML/CSS/JS/PHP,MATLAB,Assembler (x64,ARM).
  • 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」GitHubにオープンソースとして公開

こういった私から学べます.

C/C++言語の静的コード解析ツール

C言語の静的コード解析ツールを紹介します.

Clang Static Analyzer

Clang Static Analyzerは,C/C++/Objective-C言語のプログラムのバグを発見する静的コード解析ツールです.

Clang Static AnalyzerはLLVMプロジェクトの一つです.

Clang Static Analyzerの使い方は,こちらの動画が参考になります.

Cppcheck

Cppcheckは,C/C++言語の静的コード解析ツールです.

バグを検出するために独自のコード解析を行い,未定義の動作や危険なコーディング構造を検出することに重点を置いています.

Cppcheckの目標は,誤検出を少なくすることです.

Cppcheckは,非標準の構文(組込みプロジェクトでよくある)を持つC/C++言語のコードでも解析できるように設計されています.

Cppcheckの使い方は,こちらの動画が参考になります.

FlawFinder

FlawFinderは,C/C++言語を調査し,考えられるセキュリティ上の弱点 (「欠陥」) を危険度別に報告する簡単な静的コード解析ツールです.

プログラムが広く一般に公開される前に,少なくともいくつかの潜在的なセキュリティ問題を素早く発見し除去するのに非常に便利です.

FlawFinderの使い方は,こちらの動画が参考になります.

Sparse

Sparseは,ANSI Cのほとんどと多くのGCC拡張を解析できるコンパイラフロントエンドと,同じくsparseと呼ばれる静的解析器を含むコンパイラバックエンドを提供する静的コード解析ツールです.

Sparseは,アドレス空間のポインタの指す先や,ロック関数の取得や解放など,型の意味情報を伝えるための注釈セットを提供します.

Sparseの使い方は,こちらのドキュメントを読みましょう!

Sparseは,Linuxカーネルの解析に利用されています.

Linuxカーネルを知りたいあなたはこちらからどうぞ.

Linuxカーネル
元東大教員から学ぶLinuxカーネル

こういった私から学べます. Linuxカーネルとは,C言語で開発されたオープンソースのOSです. Linuxカーネルは主に以下のコンピュータで広く利用されています. スーパーコンピュータ サーバ An ...

続きを見る

GCC/Clangの-Wallオプション

GCC/Clangの-Wallオプションは,多くの警告を出力するオプションです(詳細は以下のリンク先を参照).

GCC/Clangのコンパイル時は,デフォルトで-Wallオプションをつけておくことをおすすめします.

以下のようにaliasに登録しておくと便利です.

シェル(bash,tcsh,zsh等)の設定ファイルに記載しても良いです.

-Wall以外にも-Wextra等の警告オプションもありますので,あわせて利用することを検討しましょう.

以下の記事が参考になります.

C/C++言語の動的プログラム解析ツール

C/C++言語の動的プログラム解析ツールを紹介します.

Valgrind

Valgrindは,多くのメモリ管理やスレッドのバグを自動的に検出し,プログラムを詳細にプロファイリングすることができる動的プログラム解析ツールです.

仮想プロセッサ上でプログラムを実行し,マルチスレッドプログラムのメモリエラー(malloc/free関数の誤用など)やレースコンディションを検出することができます.

Valgrindの使い方は,こちらの動画が参考になります.

Dmalloc

Dmallocは,メモリ割り当てやリークをチェックするためのライブラリです.

ソフトウェアは再コンパイルが必要で,すべてのファイルに特別なCヘッダーファイルdmalloc.hを含める必要があります.

GCC/Clangのスタック保護オプション

GCC/Clangのスタック保護オプションは,スタック破壊攻撃などのバッファオーバーフローをチェックするための余分なコードを出力します.

具体的には,以下のオプションになります.

スタック保護オプションは,脆弱なオブジェクトを持つ関数にガード変数を追加することで行われます.

alloca関数の呼び出しや,8バイト以上のバッファを持つ関数が含まれます.

ガードは,関数が入力されたときに初期化され,関数が終了するときにチェックされます.

ガードのチェックに失敗した場合,エラーメッセージが表示され,プログラムが終了します.

実際にスタック上に確保された変数のみが考慮され,最適化された変数やレジスタに確保された変数はカウントされません.

GCC/ClangのAddressSanitizerオプション

GCC/ClangのAddressSanitizerオプションは,配列等の範囲外へのアクセスやfree関数の呼び出し後の利用に関するメモリエラーを検知します.

具体的には,以下のオプションになります.

まとめ

C/C++言語の静的コード解析ツールと動的プログラム解析ツールを紹介しました.

これらのツールを使いこなして,効率的にソフトウェアを開発しましょう!

デバッグに有用なGDB,C言語のアサーション機能を知りたいあなたはこちらからどうぞ.

C言語 GDB
【C言語】GDBでプログラムを効率的にデバッグ

こういった悩みにお答えします. こういった私が解説していきます. 目次1 GNU Debugger(GDB)2 GDBの簡単な利用例2.1 GDBなしで実行2.2 GDBありで実行3 GDBによるステ ...

続きを見る

C言語 _Static_assert assert
【C言語】静的アサーション_Static_assertと動的アサーションassertマクロの使い方

こういった悩みにお答えします. こういった私から学べます. 目次1 静的アサーション_Static_assertと動的アサーションassertマクロ1.1 静的アサーション_Static_assert ...

続きを見る

C言語を独学で習得することは難しいです.

私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.

私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!

友だち追加

独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!

-C LANGUAGE, TECHNOLOGY
-, , , , ,