自分でコードを書いていると、レビューを求めたいときがある。
しかし、誰もいないので、ツールにお願いしたい。
そういうわけで、無料で使えそうな静的解析ツールを探してみよう。
昨年の調査は、ここだ。
http://hiro99ma.blogspot.com/2015/11/cc.html
いきなりだが、AdLintは今年の1月に提供が終了したそうだ。。。
Cppcheck - A tool for static C/C++ code analysis
これは、私が今使っているツールだ。
設定が簡単なのだけど、もうちょっと指摘してほしい気がする。
Infer | A static analyzer for mobile apps | Infer
昨年は、Windowsでサポートしていないのと、cygwinで試そうとして失敗したので、そのままにしていた。
今も、Windowsをサポートしていないのは同じだった。。。
はっ、今ならBash on Ubuntuがある!
依存関係をUbuntu14.04のをまねして(かなり時間がかかる)、wgetで0.9.2を取ってきて、解凍してスクリプト実行(これもかなりかかる)。
よくわからんが、スクリプトがうまく行かないようだったので、コンソールに出ていた「opam depext conf-pkg-config.1.0」を実行し、それでも何か言っているので、apt-get install clang-3.5した(時間かかる)。
だめだー。
「C compiler cannot create executables」が消えん。
config.logを見ると、単にコンパイルできていないだけのようだが。。
「CXXABI_1.3.8が無い」「GLIBCXX_3.4.20が無い」がずらずら出ているようだ。
stringsで/usr/lib/x86_64-linux-gnu/libstdc++.so.6を見ると、「CXXABI_1.3.7」「GLIBCXX_3.4.19」と、一歩手前のようだ。
プレビルドされているコンパイラが、新しいってことかな?
じゃあ、gitから直接取ってきて全部ビルドするか、とやってみたが、cmakeが古いということでppaで何か追加したところまではよかったが、バージョンがまだ古いらしい。
しかたなく、cmakeのソースからビルドし直す。。。。
えい、ここは、古いinferで試してやれ。
0.3.0くらいだったら1年前だし。。。ああ、コンパイル手順自体違う。。。
ここで無理をするのはやめよう。
Xubuntu16.04にはrelease 0.9.2があっさりインストールできた。
infer -- clang -c xxx.c
こんな感じでコマンドを打つと、コンパイル時のマクロ定義などをせずにチェックして、結果も出た。
cppcheckで通ったコードだったためか、エラーも何もない。
カレントディレクトリにinfer-out/というディレクトリができるが、bugs.txtくらいしかわからん。
procs.csvは関数ごとの何かを調べているようだが、ステップ数でも複雑度でもなさそう。
うーん。。。
helpを載せておこう。
$ infer --help
Infer version v0.9.2
Copyright 2009 - present Facebook. All Rights Reserved.
Toplevel options--analyzer | -a { capture | compile | infer | eradicate | checkers | tracing | crashcontext | linters }
Specify which analyzer to run (only one at a time is
supported):
- infer, eradicate, checkers: run the specified analysis
- capture: run capture phase only (no analysis)
- compile: run compilation command without interfering (Java
only)
- crashcontext, tracing: experimental (see --crashcontext and
--tracing)
- linters: run linters based on the ast only (Objective-C and
Objective-C++ only)
--<analyzer>-blacklist-files-containing <string>
blacklist files containing the specified string for the given
analyzer (see --analyzer for valid values)
--<analyzer>-blacklist-path-regex <path regex>
blacklist the analysis of files whose relative path matches
the specified OCaml-style regex
(to whitelist: --<analyzer>-whitelist-path-regex)
--<analyzer>-suppress-errors <error name>
do not report a type of errors
--buck-blacklist <regex>
Skip analysis of files matched by the specified regular
expression (Buck flavors only)
--changed-files-index <file>
Specify the file containing the list of files from which
reactive analysis should start
--continue Activates: Continue the capture for the reactive analysis,
increasing the changed files/procedures. (If a procedure was
changed beforehand, keep the changed marking.) (Conversely:
--no-continue)
--disable-checks <error name>
Do not show reports coming from this type of errors
--fail-on-issue Activates: Exit with error code 2 if Infer found something to
report (Conversely: --no-fail-on-issue)
--no-filtering | -nf
Deactivates: Do not show the results from experimental checks
(note: some of them may contain many false alarms)
(Conversely: --filtering | -nf)
--flavors Activates: Buck integration using Buck flavors (clang only),
eg `infer --flavors -- buck build //foo:bar#infer`
(Conversely: --no-flavors)
--inferconfig-home <dir>
Path to the .inferconfig file
--jobs | -j <int>
Run the specified number of analysis jobs simultaneously
(default: 3)
--load-average | -l <float>
Do not start new parallel jobs if the load average is greater
than that specified (Buck and make only)
--merge Activates: Merge the captured results directories specified
in the dependency file (Buck flavors only) (Conversely:
--no-merge)
--pmd-xml Activates: Output issues in (PMD) XML format (Conversely:
--no-pmd-xml)
--no-progress-bar | -npb
Deactivates: Show a progress bar (Conversely: --progress-bar
| -npb)
--project-root | -pr <dir>
Specify the root directory of the project (default:
/media/sf_work/libicdrvlic)
--Xbuck Pass values as command-line arguments to invocations of `buck
build` (Buck flavors only)
--xcode-developer-dir <XCODE_DEVELOPER_DIR>
Specify the path to Xcode developer directory (Buck flavors
only)
-- Stop argument processing, use remaining arguments as a build
command
--help | -h Display this list of options
--help-full Display the full list of options, including internal and
experimental options
Analysis (backend) options--debug | -g Activates: Debug mode (also sets --print-types and
--write-dotty) (Conversely: --no-debug | -ng)
--debug-exceptions
Activates: Generate lightweight debugging information: just
print the internal exceptions during analysis (Conversely:
--no-debug-exceptions)
--results-dir | -o <dir>
Write results and internal files in the specified directory
(default: /media/sf_work/libicdrvlic/infer-out)
--unsafe-malloc Activates: Assume that malloc(3) never returns null.
(Conversely: --no-unsafe-malloc)
--version Activates: Print version information and exit (Conversely:
--no-version)
--version-json Activates: Print version json formatted (Conversely:
--no-version-json)
Clang frontend options--cxx Activates: Analyze C++ methods, still experimental
(Conversely: --no-cxx)
--headers | -hd Activates: Analyze code in header files (Conversely:
--no-headers | -nhd)
--ml-buckets <,-separated sequence>
Specify the memory leak buckets to be checked in
Objective-C/C++:
- 'cf' checks leaks from Core Foundation,
- 'arc' from code compiled in ARC mode,
- 'narc' from code not compiled in ARC mode,
- 'cpp' from C++ code (default: cf)
--skip-clang-analysis-in-path <path prefix>
Ignore files whose path matches the given prefix
--skip-translation-headers <path prefix>
Ignore headers whose path matches the given prefix
Java frontend options--absolute-paths
Activates: Report errors using absolute paths (Conversely:
--no-absolute-paths)
--android-harness
Activates: (Experimental) Create harness to detect issues
involving the Android lifecycle (Conversely:
--no-android-harness)
--modeled-expensive <json>
Matcher or list of matchers for methods that should be
considered expensive by the performance critical checker.
(default: [])
--never-returning-null <json>
Matcher or list of matchers for functions that never return
`null`. (default: [])
--skip-translation <json>
Matcher or list of matchers for names of files that should be
analyzed at all. (default: [])
ああ、マクロ指定が無い、とかじゃなくて、--より後ろにコンパイルするコマンドを書くというやりかたなのだな。
clangじゃなくてgccでもよいのだろうし、-Dでオプションを並べてもよいのだろう。
なんとなく、clangの方がチェックしてくれそうな気がする。
エラーが出なくて寂しいが、ちゃんとエラーが出るようにしておけば出そうだから、よしとしよう。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。