【C言語】
無料でバグを検出する
お勧めのツールと
コンパイラオプション

無料のバグ 検出ツール

■おすすめのツールとコンパイラオプション

(1) cppcheck
(2-1) clang -Weverything
(2-2) clang –analyze
(2-3) clang-tidy
(3-1) gcc -Wall -Wextra
(3-2) gcc -fanalyzer


■無料のバグ検出ツールcppcheck

(1) –enable=all で確実な警告は全部言う。

(2) –inconclusive で疑わしい警告も言う(省略可能)

(3)–platform=unix64で自分の環境を指定する(省略可能)

(4)–template=~~で出力形式を指定する(省略可能)

(5)–suppressions-list=suppressions.txtで
 指定したファイルsuppressions.txt(自分で作る)内に
 抑止したい警告IDをずらずら列記する(省略可能)

#!/bin/bash -x
              
cppcheck --enable=all --inconclusive \
--platform=unix64 \
--template="{file}:{line}: ({severity}): {message} : [({severity}){id}]" \
--suppressions-list=suppressions.txt \
$*

■clangのバグ検出オプション

(1)clang -Weverything で通常警告は全部言う(ので五月蠅い)。
通常 実運用では使わない。
(2)clang –analyze で静的解析(データフロー解析)を行う。
時間がかかる。
(3)clang-tidy は主にコーディング作法回りをチェックしてくれる。
(3-1)-checks=*は「全部言え」を意味する。
(3-2)ハイフォンで始まる -hicpp~などが「黙れ」を意味する。
(3-3)–(ハイフォンハイフォン)の後ろに通常のコンパイルオプションを記述する。

#!/bin/bash -x

clang -Weverything -O2   $* -c -Wno-missing-prototypes
clang --analyze    -O2   $* -c -Wno-missing-prototypes

clang-tidy  $1 \
-checks=*,\
-hicpp-braces-around-statements,\
-readability-braces-around-statements,\
-google-readability-braces-around-statements -- $* -O2 

■gccのバグ検出オプション

(1) gcc -Wall の -Wall は「警告全部」ではなくて
 「これだけは全部直せ」の意味。
  職業プログラマはgcc -Wall -Wextraの警告を全部直したい。
(2)最適化オプション(-O)のレベルによって
  警告が出たりでなかったりするが、
  通常最適化したほうがより深い警告を出してくれる
 (関数を跨いだ未初期化変数とか)
(3)gcc -fanalyzer は最近リリースされた静的解析オプションで
  メモリーリークやNULLポインタ参照を深く解析してくれる。

#!/bin/bash -x

gcc   -Wall -Wextra       $* -c
gcc   -Wall -Wextra -O2   $* -c
gcc   -fanalyzer    -O2   $* -c

■使用上の注意

gcc -pedantic と
clang -Weverythingは製品開発の実運用で使用してはいけません。
詳しくはこちら ”gcc -pedanticを使う必要はない”を参照

参考:

https://cppcheck.sourceforge.io