■おすすめのツールとコンパイラオプション
(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を使う必要はない”を参照
参考: