Visual C++の静的解析を利用する方針
Visual C++で標準搭載されている静的解析をプロジェクトに適用する際に、どのように考えれば良いかを調べています。
Visual Studio 2019 で実施するコード分析の設定方針
「C++ Core Check …」の全てと、「Micosoft ネイティブ推奨規則」を、コード分析位の対象とします。
この設定で運用し、必要に応じて調整すれば良いかと。
また、コード分析には一定の時間が掛かるため、どのタイミングでコード分析を実施するかは、別途決めが必要です。開発者が自身でコンパイルする時は任意としておき、コミット前、コミット時、CIビルド時には実行するなど決めていきたいと思います。
静的解析(コード分析)の設定
設定は、プロジェクトプロパティのコード分析で、分析の有効化と分析する項目の選択を行います。
- ビルドに対するコード分析の有効化:通常ビルド時にコード分析を実行する
- Microsoft コード分析の有効化:Microsoft定義のコード分析を実行する
- Clang-Tidy の有効化:Clang-Tidy定義のコード分析を実行する
Microsoft
Microsoftが用意しているコード分析の項目になります。
Microsoft独自の項目と Visual Studio C++ Core Check Reference の項目があります。
上記規則セットを選び、実際にコード分析する項目を決定することになります。
設定した規則セットの項目がなにであるかは、下記ビューで確認できます。
チェックした項目を警告とするかコンパイルエラーとするか設定できるため、C++の構文上問題がないプログラムでも、強制的にエラーとできます。
Clang-Tidy
Clang-Tidyのコード分析が実施されるようになります。
こちらも、個別に項目を設定できるようです。
名前の接頭辞 | 説明 |
---|---|
abseil- | Abseilライブラリに関連するチェック。 |
android- | Androidに関連するチェック。 |
boost- | Boostライブラリに関連するチェック。 |
bugprone- | ターゲットのバグが発生しやすいコード構造をチェックします。 |
cert- | CERTセキュアコーディングガイドラインに関連するチェック。 |
clang-analyzer- | Clang Static Analyzerチェック。 |
cppcoreguidelines- | C ++コアガイドラインに関連するチェック。 |
darwin- | Darwinコーディング規約に関連するチェック。 |
fuchsia- | フクシアのコーディング規約に関連するチェック。 |
google- | Googleのコーディング規約に関連するチェック。 |
hicpp- | High Integrity C ++ Coding Standardに関連するチェック。 |
linuxkernel- | Linuxカーネルのコーディング規約に関連するチェック。 |
llvm- | LLVMコーディング規約に関連するチェック。 |
llvmlibc- | LLVM-libcコーディング標準に関連するチェック。 |
misc- | より適切なカテゴリがないことを確認します。 |
modernize- | モダン(現在「モダン」は「C ++ 11」を意味する)言語構成の使用を提唱していることを確認します。 |
mpi- | MPI(Message Passing Interface)に関連するチェック。 |
objc- | Objective-Cコーディング規約に関連するチェック。 |
openmp- | OpenMP APIに関連するチェック。 |
performance- | パフォーマンス関連の問題を対象とするチェック。 |
portability- | 特定のコーディングスタイルに関連しない移植性関連の問題を対象とすることを確認します。 |
readability- | 特定のコーディングスタイルに関連しない読みやすさ関連の問題を対象とするチェック。 |
zircon- | Zirconカーネルコーディング規約に関連するチェック。 |
警告コード
C++ Core Guidelines チェッカーの警告 (C26400-C26820)
C++ のコード分析の警告 (C1250-C1257, C6001-C6997, C26100-C26167, C26800-C26811, C28020-C28351)
コンパイラ警告 (C4000-C5999)
コード分析ではなく、通常のコンパイル時にチェックされる警告。コンパイル時の警告レベルを設定することで、チェックする範囲を制限できます。
Clang-xxx
Clang-Tidyの警告は、Cxxxではなく、Clang-xxxで表示されます。