How to build Iroha 1.0 under MSAN
Requirements
Linux (msan doesn’t work on Windows or MacOS), clang 8 (7 should also work)
Build instrumented version of libc++
- Checkout LLVM, libc++ and libc++abi
$ svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
$ (cd llvm/projects && svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx)
$ (cd llvm/projects && svn co http://llvm.org/svn/llvm-project/libcxxabi/trunk libcxxabi)
- Build libc++ with MSan:
$ mkdir libcxx_msan && cd libcxx_msan
$ cmake ../llvm -DCMAKE_BUILD_TYPE=Release -DLLVM_USE_SANITIZER=Memory -DCMAKE_C_COMPILER=clang-8 -DCMAKE_CXX_COMPILER=clang++-8
$ make cxx -j$(nproc)
Build instrumented version of boost
- Download and unpack boost from https://dl.bintray.com/boostorg/release/1.70.0/source/boost_1_70_0.tar.bz2
- Download https://raw.githubusercontent.com/ecatmur/variant/7331d648f46b6008138cbd22087b8c5c61ff7926/include/boost/variant/detail/apply_visitor_unary.hpp and replace ./boost/variant/detail/apply_visitor_unary.hpp with it
- Download https://raw.githubusercontent.com/ecatmur/variant/7331d648f46b6008138cbd22087b8c5c61ff7926/test/const_ref_apply_visitor.cpp and replace ./libs/variant/test/const_ref_apply_visitor.cpp with it
- From the directory where you have just unpacked boost run:
$ ./bootstrap.sh --with-libraries=thread,system,filesystem --prefix=/home/luckychess/src/msan_guide/boost/boost_1_70_0_msan --with-toolset=clang
(--prefix is a path where built libraries will be stored, create this directory first)
- Open file project-config.jam with a text editor. Find “using clang” line and replace it with the next line:
using clang : 8.0 : : <cxxflags>"-fsanitize=memory -fsanitize-memory-track-origins -stdlib=libc++ -L/home/luckychess/src/msan_guide/libcxx_msan/lib -lc++abi -I/home/luckychess/src/msan_guide/libcxx_msan/include -I/home/luckychess/src/msan_guide/libcxx_msan/include/c++/v1" ;
Paths at -L and -I parameters are actually paths to directories from the previous step. Also please note - there is a space after ; (in the line’s very end)
Prepare Iroha to build (check https://github.com/luckychess/iroha-1/tree/msan):
- Please ensure that no external dependencies are installed (like protobuf, grpc…). Boost can be installed - boost path will be passed to cmake explicitly.
- In the root CMakeLists.txt find
append_build_flags(-fsanitize=memory -fsanitize-memory-track-origins)
line and replace it with
append_build_flags(-fsanitize=memory -fsanitize-memory-track-origins -stdlib=libc++ -L/home/luckychess/src/msan_guide/libcxx_msan/lib -lc++abi -I/home/luckychess/src/msan_guide/libcxx_msan/include -I/home/luckychess/src/msan_guide/libcxx_msan/include/c++/v1 -Wno-error=unused-command-line-argument)
(change paths to your own)
- In functions.cmake add libcxx_msan/lib path to LD_LIBRARY_PATH for protoc, e.g.:
set(GEN_COMMAND ${CMAKE_COMMAND} -E env LD_LIBRARY_PATH=${protobuf_LIBRARY_DIR}:$ENV{LD_LIBRARY_PATH}:/home/luckychess/src/libcxx_msan/lib "${protoc_EXECUTABLE}")
Note: tbb still remains uncovered which could bring some inaccuracies. It's way too painful to integrate it at the moment.
Build Iroha
$ mkdir build && cd build
$ cmake -DCMAKE_C_COMPILER=clang-8 -DCMAKE_CXX_COMPILER=clang++-8 -DSANITIZE_MEMORY=ON -DBOOST_ROOT=/home/luckychess/src/msan_guide/boost/boost_1_70_0_msan ..
(set -DBOOST_ROOT to your own boost root )
$ LD_LIBRARY_PATH=/home/luckychess/src/msan_guide/libcxx_msan/lib make irohad (or just make) (again use your own path)