[build] add address, undefined behavior + thread sanitizer

This commit is contained in:
Konstantin Käfer
2017-06-23 15:51:55 -07:00
parent b0dcc25584
commit 92354bdc25
3 changed files with 151 additions and 4 deletions

View File

@@ -68,7 +68,7 @@ if(WITH_COVERAGE)
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} --coverage")
endif(WITH_COVERAGE)
set(CMAKE_CONFIGURATION_TYPES Debug Release)
set(CMAKE_CONFIGURATION_TYPES Debug Release Sanitize)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -ftemplate-depth=1024 -Wall -Wextra -Wshadow -Wnon-virtual-dtor -Werror -Wno-variadic-macros -Wno-unknown-pragmas")
if(APPLE AND CMAKE_CXX_COMPILER_ID MATCHES ".*Clang")
@@ -76,6 +76,7 @@ if(APPLE AND CMAKE_CXX_COMPILER_ID MATCHES ".*Clang")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=unused-command-line-argument")
endif()
set(CMAKE_CXX_FLAGS_RELEASE "-Os -DNDEBUG")
set(CMAKE_CXX_FLAGS_SANITIZE "-O1 -g -fno-omit-frame-pointer -fno-optimize-sibling-calls")
if(CMAKE_CXX_COMPILER_ID MATCHES ".*Clang")

View File

@@ -2,9 +2,10 @@ export BUILDTYPE ?= Debug
export WITH_CXX11ABI ?= $(shell scripts/check-cxx11abi.sh)
ifeq ($(BUILDTYPE), Release)
else ifeq ($(BUILDTYPE), Sanitize)
else ifeq ($(BUILDTYPE), Debug)
else
$(error BUILDTYPE must be Debug or Release)
$(error BUILDTYPE must be Debug, Sanitize or Release)
endif
buildtype := $(shell echo "$(BUILDTYPE)" | tr "[A-Z]" "[a-z]")
@@ -297,8 +298,12 @@ benchmark: $(LINUX_BUILD)
$(NINJA) $(NINJA_ARGS) -j$(JOBS) -C $(LINUX_OUTPUT_PATH) mbgl-benchmark
ifneq (,$(shell command -v gdb 2> /dev/null))
GDB = $(shell scripts/mason.sh PREFIX gdb VERSION 2017-04-08-aebcde5)/bin/gdb \
-batch -return-child-result -ex 'set print thread-events off' -ex 'run' -ex 'thread apply all bt' --args
GDB ?= $(shell scripts/mason.sh PREFIX gdb VERSION 2017-04-08-aebcde5)/bin/gdb \
-batch -return-child-result \
-ex 'set print thread-events off' \
-ex 'set disable-randomization off' \
-ex 'run' \
-ex 'thread apply all bt' --args
endif
.PHONY: run-test

View File

@@ -11,6 +11,9 @@ workflows:
- node6-clang39-release
- node6-clang39-debug
- linux-clang39-debug
- linux-clang4-sanitize-address
- linux-clang4-sanitize-undefined
- linux-clang4-sanitize-thread
- linux-gcc4.9-debug
- linux-gcc5-debug-coverage
- linux-gcc5-release-qt4
@@ -332,6 +335,144 @@ jobs:
- node_modules
- /root/.ccache
# ------------------------------------------------------------------------------
linux-clang4-sanitize-address:
docker:
- image: mbgl/ci:r4-linux-clang-4
working_directory: /src
environment:
LIBSYSCONFCPUS: 6
JOBS: 6
BUILDTYPE: Sanitize
WITH_EGL: 1
GDB: '' # Do not run with GDB
CXXFLAGS: -fsanitize=address
LDFLAGS: -fsanitize=address
ASAN_OPTIONS: detect_leaks=0:color=always
steps:
- checkout
- restore_cache:
key: v1-linux-clang4-sanitize-address
paths:
- node_modules
- /root/.ccache
- run:
name: Environment Setup
command: |
# LLVM has a hard check for "llvm-symbolizer" and doesn't support suffixed executables
ln -s /usr/bin/llvm-symbolizer-* /usr/bin/llvm-symbolizer
# We'll use tee to redirect stderr to a file so we can check for sanitiziation
# https://bugs.launchpad.net/ubuntu/+source/xorg-server/+bug/1059947
sed -i 's/"$@" 2>&1/"$@"/' /usr/bin/xvfb-run
- run:
name: Build test
command: make test
- run:
name: Run tests
command: |
xvfb-run --server-args="-screen 0 1024x768x24" make run-test 2> >(tee sanitizer 1>&2)
# Unfortunately, Google Test eats the status code, so we'll have to check the output.
[ -z "$(sed -n '/^SUMMARY: AddressSanitizer:/p' sanitizer)" ]
- save_cache:
key: v1-linux-clang4-sanitize-address
paths:
- node_modules
- /root/.ccache
# ------------------------------------------------------------------------------
linux-clang4-sanitize-undefined:
docker:
- image: mbgl/ci:r4-linux-clang-4
working_directory: /src
environment:
LIBSYSCONFCPUS: 6
JOBS: 6
BUILDTYPE: Sanitize
WITH_EGL: 1
GDB: '' # Do not run with GDB
CXXFLAGS: -fsanitize=undefined
LDFLAGS: -fsanitize=undefined
UBSAN_OPTIONS: print_stacktrace=1:color=always
steps:
- checkout
- restore_cache:
key: v1-linux-clang4-sanitize-undefined
paths:
- node_modules
- /root/.ccache
- run:
name: Environment Setup
command: |
# LLVM has a hard check for "llvm-symbolizer" and doesn't support suffixed executables
ln -s /usr/bin/llvm-symbolizer-* /usr/bin/llvm-symbolizer
# We'll use tee to redirect stderr to a file so we can check for sanitiziation
# https://bugs.launchpad.net/ubuntu/+source/xorg-server/+bug/1059947
sed -i 's/"$@" 2>&1/"$@"/' /usr/bin/xvfb-run
- run:
name: Build test
command: make test
- run:
name: Run tests
command: |
xvfb-run --server-args="-screen 0 1024x768x24" make run-test 2> >(tee sanitizer 1>&2)
# Unfortunately, Google Test eats the status code, so we'll have to check the output.
# Uncomment this once we've fixed all thread behavior to make new thread behavior
# fail on CircleCI.
# [ -z "$(sed -n '/^SUMMARY: UndefinedBehaviorSanitizer:/p' sanitizer)" ]
- save_cache:
key: v1-linux-clang4-sanitize-address-undefined
paths:
- node_modules
- /root/.ccache
# ------------------------------------------------------------------------------
linux-clang4-sanitize-thread:
docker:
- image: mbgl/ci:r4-linux-clang-4
working_directory: /src
environment:
LIBSYSCONFCPUS: 6
JOBS: 6
BUILDTYPE: Sanitize
WITH_EGL: 1
GDB: '' # Do not run with GDB
CXXFLAGS: -fsanitize=thread
LDFLAGS: -fsanitize=thread
TSAN_OPTIONS: color=always
steps:
- checkout
- restore_cache:
key: v1-linux-clang4-sanitize-thread
paths:
- node_modules
- /root/.ccache
- run:
name: Environment Setup
command: |
# LLVM has a hard check for "llvm-symbolizer" and doesn't support suffixed executables
ln -s /usr/bin/llvm-symbolizer-* /usr/bin/llvm-symbolizer
# We'll use tee to redirect stderr to a file so we can check for sanitiziation
# https://bugs.launchpad.net/ubuntu/+source/xorg-server/+bug/1059947
sed -i 's/"$@" 2>&1/"$@"/' /usr/bin/xvfb-run
- run:
name: Build test
command: make test
- run:
name: Run tests
command: |
xvfb-run --server-args="-screen 0 1024x768x24" make run-test 2> >(tee sanitizer 1>&2)
# Unfortunately, Google Test eats the status code, so we'll have to check the output.
[ -z "$(sed -n '/^SUMMARY: ThreadSanitizer:/p' sanitizer)" ]
- save_cache:
key: v1-linux-clang4-sanitize-thread
paths:
- node_modules
- /root/.ccache
# ------------------------------------------------------------------------------
linux-gcc4.9-debug:
docker: