C LANGUAGE TECHNOLOGY

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

2022年5月15日

悩んでいる人

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

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

本記事の信頼性

  • リアルタイムシステムの研究歴12年.
  • 東大教員の時に,英語でOS(Linuxカーネル)の授業.
  • 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校(UNC)コンピュータサイエンス学部で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発.
  • プログラミング歴15年以上,習得している言語: C/C++PythonSolidity/Vyper,Java,Ruby,Go,Rust,D,HTML/CSS/JS/PHP,MATLAB,Assembler (x64,ARM).
  • 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」GitHubにオープンソースとして公開
  • 2020年1月~現在はアメリカのノースカロライナ州チャペルヒルにあるGuarantee Happiness LLCのCTOとしてECサイト開発やWeb/SNSマーケティングの業務.2022年6月~現在はアメリカのノースカロライナ州チャペルヒルにあるJapanese Tar Heel, Inc.のCEO兼CTO.
  • 最近は自然言語処理AIイーサリアムに関する有益な情報発信に従事.
    • (AI全般を含む)自然言語処理AIの論文の日本語訳や,AIチャットボット(ChatGPT,Auto-GPT,Gemini(旧Bard)など)の記事を50本以上執筆.アメリカのサンフランシスコ(広義のシリコンバレー)の会社でプロンプトエンジニア・マネージャー・Quality Assurance(QA)の業務委託の経験あり.
    • (スマートコントラクトのプログラミングを含む)イーサリアムや仮想通貨全般の記事を200本以上執筆.イギリスのロンドンの会社で仮想通貨の英語の記事を日本語に翻訳する業務委託の経験あり.

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

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

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

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

友だち追加

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

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カーネルを知りたいあなたはこちらからどうぞ.

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言語を独学で習得することは難しいです.

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

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

友だち追加

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

-C LANGUAGE, TECHNOLOGY
-, , , , ,