Skip to content

Commit

Permalink
gitlab-ci: add memory leaks detection via LSAN
Browse files Browse the repository at this point in the history
The change enables memory leaks detection to existing ASAN testing
routine and introduces suppression files with the corresponding
exception list:
 * address sanitizer for compile-time: asan/asan.supp
 * memory leak sanitizer for run-time: asan/lsan.supp

Furthermore, added engine and replication suites for ASAN testing
routine.

Additionally to the tests blacklisted within #4359,
'box/on_shutdown.test.lua' is also disabled since it fails the
introduced leak check. All blacklisted tests have to be enabled
within #4360.

Close #2058

(cherry picked from commit e737400)
  • Loading branch information
avtikhon authored and kyukhin committed Apr 2, 2020
1 parent f0948d0 commit 0b900d2
Show file tree
Hide file tree
Showing 5 changed files with 152 additions and 8 deletions.
17 changes: 11 additions & 6 deletions .travis.mk
Expand Up @@ -112,15 +112,20 @@ coverage_debian: deps_debian test_coverage_debian_no_deps
# ASAN

build_asan_debian:
CC=clang-8 CXX=clang++-8 cmake . -DCMAKE_BUILD_TYPE=RelWithDebInfo -DENABLE_WERROR=ON ${CMAKE_EXTRA_PARAMS}
CC=clang-8 CXX=clang++-8 cmake . -DENABLE_ASAN=ON ${CMAKE_EXTRA_PARAMS}
CC=clang-8 CXX=clang++-8 cmake . -DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DENABLE_WERROR=ON -DENABLE_ASAN=ON ${CMAKE_EXTRA_PARAMS}
make -j

test_asan_debian_no_deps: build_asan_debian
# temporary excluded engine/ and replication/ suites with some tests from other suites by issue #4360
cd test && ASAN=ON ASAN_OPTIONS=detect_leaks=0 ./test-run.py --force $(TEST_RUN_EXTRA_PARAMS) \
app/ app-tap/ box/ box-py/ box-tap/ engine_long/ long_run-py/ luajit-tap/ \
replication-py/ small/ sql/ sql-tap/ swim/ unit/ vinyl/ wal_off/ xlog/ xlog-py/
# Temporary excluded some tests by issue #4360:
# - To exclude tests from ASAN checks the asan/asan.supp file
# was set at the build time in cmake/profile.cmake file.
# - To exclude tests from LSAN checks the asan/lsan.supp file
# was set in environment options to be used at run time.
cd test && ASAN=ON \
LSAN_OPTIONS=suppressions=${PWD}/asan/lsan.supp \
ASAN_OPTIONS=heap_profile=0:unmap_shadow_on_exit=1:detect_invalid_pointer_pairs=1:symbolize=1:detect_leaks=1:dump_instruction_bytes=1:print_suppressions=0 \
./test-run.py --force $(TEST_RUN_EXTRA_PARAMS)

test_asan_debian: deps_debian deps_buster_clang_8 test_asan_debian_no_deps

Expand Down
24 changes: 24 additions & 0 deletions asan/asan.supp
@@ -0,0 +1,24 @@
# All exceptions are under control of the issue:
# https://github.com/tarantool/tarantool/issues/4360
#
# File format:
#fun:*
#src:*

# !test: app-tap/json.test.lua
# source: third_party/lua-cjson/lua_cjson.c
fun:json_decode

# test: engine/replica_join.test.lua
# source: src/box/memtx_engine.c
fun:memtx_tuple_delete

# test: unit/base64.test.lua
# source: third_party/base64.c
fun:base64_decode_block
# source: test/unit/base64.c
fun:base64_test

# !test: unit/msgpack.test
# source: src/lib/msgpuck/test/msgpuck.c
fun:test_mp_print
108 changes: 108 additions & 0 deletions asan/lsan.supp
@@ -0,0 +1,108 @@
# All exceptions are under control of the issue:
# https://github.com/tarantool/tarantool/issues/4360
#
# File format:
#leak:*

# test: app/crypto.test.lua
# source: /usr/lib/x86_64-linux-gnu/libcrypto.so
leak:CRYPTO_zalloc

# test: app-tap/http_client.test.lua
# source: src/tarantool
leak:Curl_setstropt
leak:create_conn
leak:Curl_conncache_add_conn
leak:alloc_addbyter
leak:Curl_getaddrinfo_ex
leak:Curl_cache_addr
leak:Curl_hash_init
leak:Curl_hash_add
leak:Curl_he2ai
leak:Curl_open
leak:Curl_resolver_init

# test: app-tap/iconv.test.lua
# source: /usr/lib/x86_64-linux-gnu/gconv/UTF-16.so
leak:gconv_init

# test: box*/
# source: third_party/luajit
leak:lj_BC_FUNCC

# test: box/access.test.lua
# test: box/access_bin.test.lua
# test: box/access_misc.test.lua
# source: src/box/error.cc
leak:AccessDeniedError::AccessDeniedError

# test: box/bitset.test.lua
# source: src/lib/bitset/iterator.c
leak:tt_bitset_iterator_init

# test: box-py/args.test.py
# source: /lib/x86_64-linux-gnu/libc.so*
leak:libc.so*

# test: box-tap/schema-mt.test.lua
# source: src/lib/core/coio_task.c
leak:coio_on_start
# source: src/lib/salad/mhash.h
leak:mh_i32ptr_new

# test: replication/misc.test.lua
# source: src/box/vy_log.c
leak:vy_recovery_new_f
# source: src/lib/salad/mhash.h
leak:mh_i64ptr_new

# test: sql-tap/gh2250-trigger-chain-limit.test.lua
# source: src/lib/core/exception.cc
leak:Exception::operator new

# test: sql-tap/trigger9.test.lua
# source: src/lib/core/fiber.c
leak:cord_start

# test: sql-tap/tkt-7bbfb7d442.test.lua
# test: sql-tap/view.test.lua
# test: sql-tap/with1.test.lua
# test: sql-tap/with2.test.lua
# source: src/box/sql/malloc.c
leak:sql_sized_malloc

# test: swim/errinj.test.lua
# test: swim/swim.test.lua
# source: src/lib/swim/swim.c
leak:swim_member_new
leak:swim_update_member_payload

# !test: unit/bps_tree.test.lua
# source: src/lib/salad/bps_tree.h
leak:bps_tree_test_create_leaf
leak:bps_tree_test_process_insert_leaf

# !test: unit/heap.test.lua
# source: test/unit/heap.c
leak:test_random_delete_workload
leak:test_delete_last_node

# !test: unit/heap_iterator.test.lua
# source: src/lib/salad/heap.h
leak:test_heap_reserve

# !test: unit/swim.test.lua
# source: src/lib/swim/swim_io.c
leak:swim_scheduler_set_codec

# test: vinyl/errinj.test.lua
# source: src/lib/core/fiber.h
leak:fiber_cxx_invoke

# test: vinyl/errinj_ddl.test.lua
# source: src/box/vy_stmt.c
leak:vy_stmt_alloc

# test: vinyl/recover.test.lua
# source: src/lib/core/fiber.c
leak:cord_costart_thread_func
4 changes: 2 additions & 2 deletions cmake/profile.cmake
Expand Up @@ -53,7 +53,7 @@ if (ENABLE_ASAN)
"\n")
endif()

set(CMAKE_REQUIRED_FLAGS "-fsanitize=address")
set(CMAKE_REQUIRED_FLAGS "-fsanitize=address -fsanitize-blacklist=${CMAKE_SOURCE_DIR}/asan/asan.supp")
check_c_source_compiles("int main(void) {
#include <sanitizer/asan_interface.h>
void *x;
Expand All @@ -76,5 +76,5 @@ if (ENABLE_ASAN)
message(FATAL_ERROR "Cannot enable AddressSanitizer")
endif()

add_compile_flags("C;CXX" -fsanitize=address)
add_compile_flags("C;CXX" -fsanitize=address -fsanitize-blacklist=${CMAKE_SOURCE_DIR}/asan/asan.supp)
endif()
7 changes: 7 additions & 0 deletions test/box/on_shutdown.skipcond
@@ -0,0 +1,7 @@
import os

# Disabled at ASAN build due to issue #4360.
if os.getenv("ASAN") == 'ON':
self.skip = 1

# vim: set ft=python:

0 comments on commit 0b900d2

Please sign in to comment.