2016/09/08

[c/c++]私のC言語 (15) - 静的解析ツール

自分でコードを書いていると、レビューを求めたいときがある。
しかし、誰もいないので、ツールにお願いしたい。
そういうわけで、無料で使えそうな静的解析ツールを探してみよう。

昨年の調査は、ここだ。
http://hiro99ma.blogspot.com/2015/11/cc.html


静的解析ツール AdLint (アドリント)

いきなりだが、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 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。