Skip to content

DoctorQ/facebook-clang-plugins

 
 

Repository files navigation

Facebook Clang Plugins

This repository aims to share some useful clang plugins developed at Facebook.

It contains two kinds of plugins to the clang compiler:

  • analyzer plugins use the internal APIs of clang analyzer to find bugs and report them;

  • frontend plugins process the syntax of source files directly to accomplish more general tasks; specifically, we have developed a clang-to-ocaml bridge to make code analyses easier.

Most of the plugins here have been written with iOS in mind. However different platforms may be considered in the future.

Pre-release notes

This pre-release is meant to spark interest and gather early feedback. Plugins are still subject to be deleted, moved, added, or heavily rewritten.

Structure of the repository

  • analyzer : plugins for clang analyzer,

  • libtooling : frontend plugins (currently a clang-to-json AST exporter),

  • clang-ocaml : ocaml libraries to process the Json output of frontend plugins,

  • extra-repo-example : example of external repository where to add plugins and piggyback on the build system.

Quick start

Clang plugins needs to be loaded in a target compiler that matches the API in use.

General instructions to compile clang can be found here: http://clang.llvm.org/get_started.html

Compile clang with a setup script: To compile and use the required version of clang, please run ./clang/setup.sh. If you use this script, you don't need to export the variable CLANG_PREFIX to compile the plugin.

Alternatively, here are the steps to do this manually:

The current version of the plugins requires a clang compiler to be compiled from the following sources:

Typically, compilation is made from a directory next to llvm along the following lines:

# from $HOME/git or equivalent
export CLANG_PREFIX=/usr/local
mkdir -p llvm-build
cd llvm-build
../llvm/configure --prefix="$CLANG_PREFIX" --enable-libcpp --enable-cxx11 --disable-assertions --enable-optimized
make -j 8 && make install
cp Release/bin/clang "$CLANG_PREFIX/bin/clang"
strip -x "$CLANG_PREFIX/bin/clang"

Caveat:

  • Because of the nature of C++, clang and the plugins need to be compiled with the exact same C++ libraries.
  • Also, the default stripping command of clang in release mode breaks plugins.

Once the target compiler is installed, the following should run the unit tests:

export CLANG_PREFIX=/usr/local #should be the same as above
export CLANG_PLUGINS_EXTRA_REPO=extra-repo-example
make test

Ocaml users may also run:

make -C clang-ocaml test  #requires proper ocaml libraries, see included clang-ocaml/README

Mac users may create an Xcode project as follows:

export CLANG_PREFIX=/usr/local #should be the same as above
make xcode

Additional configuration options are available in Makefile.config (and possibly CMakeLists.txt).

About

Plugins to clang-analyzer and clang-frontend

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C++ 71.9%
  • Objective-C 8.6%
  • OCaml 8.2%
  • Makefile 5.5%
  • OpenEdge ABL 2.1%
  • Python 1.1%
  • Other 2.6%