Compare commits

..

16 Commits

Author SHA1 Message Date
Antony Polukhin
7c7271d9bc CI coverage fixes (5) 2019-06-30 15:26:11 +03:00
Antony Polukhin
6007c216b9 CI coverage fixes (4) 2019-06-30 13:16:12 +03:00
Antony Polukhin
d5bbf7853a CI coverage fixes (3) 2019-06-30 12:30:30 +03:00
Antony Polukhin
0be61ab0b8 CI coverage fix (2) 2019-06-30 10:14:44 +03:00
Antony Polukhin
43b837d181 Attempt to fix coverage 2019-06-29 20:43:33 +03:00
Antony Polukhin
2f75119cd0 Use lcov 1.14 2019-06-29 11:40:10 +03:00
Antony Polukhin
36734b1531 Trim null characters on Windows (fixes #78) 2019-06-29 10:44:27 +03:00
Antony Polukhin
2d810e294f Try to reproduce the error from #78 in tests 2019-06-28 22:38:49 +03:00
Antony Polukhin
6e79da7420 Fix frame info output with TSAN 2019-06-28 11:12:35 +03:00
Antony Polukhin
71acd94944 Fix empty frame info output with TSAN 2019-06-28 10:41:44 +03:00
Antony Polukhin
324a303fb0 Better diagnostics for test 2019-06-27 13:17:08 +03:00
Antony Polukhin
876349f0d6 Use gold linker for TSAN 2019-06-27 10:38:37 +03:00
Antony Polukhin
63d5d2730f Fix CI runs with thread sanitizer 2019-06-26 18:11:26 +03:00
Antony Polukhin
248eedd52f Fix ubsan library version 2019-06-26 14:50:20 +03:00
Antony Polukhin
c906a69c1d Test on GCC-8 because of tsan issues in GCC-6 2019-06-26 13:46:45 +03:00
Antony Polukhin
4f9da2ae71 Manually force rebuild for thread sanitizer tests 2019-06-26 13:12:34 +03:00
5 changed files with 69 additions and 20 deletions

View File

@@ -28,7 +28,8 @@ env:
# Files, which coverage results must be ignored (files from other projects).
# Example: - IGNORE_COVERAGE='*/boost/progress.hpp */filesystem/src/*'
- IGNORE_COVERAGE='*/numeric/conversion/converter_policies.hpp */boost/progress.hpp */filesystem/src/* */libs/timer/src/* */thread/src/* */pthread/once_atomic.cpp */src/pthread/thread.cpp */thread/src/future.cpp */boost/operators.hpp'
#- IGNORE_COVERAGE="'*/filesystem/*' '*/libs/timer/src/*' '*/thread/*'"
- IGNORE_COVERAGE=''
# Explicitly remove the following library from Boost. This may be usefull, if you're for example running Travis
# from `Boost.DLL` repo, while Boost already has `dll`.
@@ -39,11 +40,11 @@ env:
matrix:
# Note that "--coverage -fsanitize=address,leak,undefined -DBOOST_TRAVISCI_BUILD" are added automatically lower in code
- CXX_FLAGS="-std=c++98" LINK_FLAGS="" TOOLSET=gcc-6
- CXX_FLAGS="-std=c++11" LINK_FLAGS="" TOOLSET=gcc-6
- CXX_FLAGS="-std=c++1y" LINK_FLAGS="" TOOLSET=gcc-6
- CXX_FLAGS="-std=c++11 -O0" LINK_FLAGS="" TOOLSET=gcc-6
- CXX_FLAGS="-std=c++11 -O1" LINK_FLAGS="" TOOLSET=gcc-6
- CXX_FLAGS="-std=c++98" LINK_FLAGS="" TOOLSET=gcc-8
- CXX_FLAGS="-std=c++11" LINK_FLAGS="" TOOLSET=gcc-8
- CXX_FLAGS="-std=c++1y" LINK_FLAGS="" TOOLSET=gcc-8
- CXX_FLAGS="-std=c++11 -O0" LINK_FLAGS="" TOOLSET=gcc-8
- CXX_FLAGS="-std=c++11 -O1" LINK_FLAGS="" TOOLSET=gcc-8
#- CXX_FLAGS="-std=c++11 -stdlib=libc++" LINK_FLAGS="-stdlib=libc++" TOOLSET=clang
#- CXX_FLAGS="-std=c++1y -stdlib=libc++" LINK_FLAGS="-stdlib=libc++" TOOLSET=clang
@@ -61,10 +62,11 @@ addons:
packages:
- git
- python-yaml
- gcc-6
- g++-6
- gcc-8
- g++-8
- clang
- libc++-dev
- binutils-gold
before_install:
# Set this to the name of the library
@@ -90,8 +92,8 @@ before_install:
script:
# `--coverage` flags required to generate coverage info for Coveralls
- ../../../b2 -a "testing.launcher=LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libasan.so.3 " address-model=64 architecture=x86 toolset=$TOOLSET cxxflags="--coverage -fsanitize=address,undefined -DBOOST_TRAVISCI_BUILD $CXX_FLAGS" linkflags="$LINK_FLAGS --coverage -lasan -lubsan"
- ../../../b2 -a address-model=64 architecture=x86 toolset=$TOOLSET cxxflags="-fsanitize=thread -DBOOST_TRAVISCI_BUILD $CXX_FLAGS" linkflags="$LINK_FLAGS -ltsan"
- ../../../b2 -a "testing.launcher=LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libasan.so.5 " address-model=64 architecture=x86 toolset=$TOOLSET cxxflags="--coverage -fsanitize=address,undefined -DBOOST_TRAVISCI_BUILD $CXX_FLAGS" linkflags="$LINK_FLAGS --coverage -lasan -lubsan"
- ../../../b2 -a address-model=64 architecture=x86 thread-sanitizer=norecover toolset=$TOOLSET cxxflags="-DBOOST_TRAVISCI_BUILD $CXX_FLAGS" linkflags="$LINK_FLAGS -fuse-ld=gold"
after_success:
# Copying Coveralls data to a separate folder
@@ -100,9 +102,9 @@ after_success:
- find ../../../bin.v2/ -name "*.gcno" -exec cp "{}" $TRAVIS_BUILD_DIR/coverals/ \;
- find ../../../bin.v2/ -name "*.da" -exec cp "{}" $TRAVIS_BUILD_DIR/coverals/ \;
- find ../../../bin.v2/ -name "*.no" -exec cp "{}" $TRAVIS_BUILD_DIR/coverals/ \;
- wget https://github.com/linux-test-project/lcov/archive/v1.12.zip
- unzip v1.12.zip
- LCOV="`pwd`/lcov-1.12/bin/lcov --gcov-tool gcov-6"
- wget https://github.com/linux-test-project/lcov/archive/v1.14.zip
- unzip v1.14.zip
- LCOV="`pwd`/lcov-1.14/bin/lcov --gcov-tool gcov-8"
# Preparing Coveralls data by changind data format to a readable one
- echo "$LCOV --directory $TRAVIS_BUILD_DIR/coverals --base-directory `pwd` --capture --output-file $TRAVIS_BUILD_DIR/coverals/coverage.info"
@@ -113,7 +115,7 @@ after_success:
- $LCOV --remove $TRAVIS_BUILD_DIR/coverals/coverage.info "/usr*" "*/$PROJECT_TO_TEST/test/*" $IGNORE_COVERAGE "*/$PROJECT_TO_TEST/tests/*" "*/$PROJECT_TO_TEST/examples/*" "*/$PROJECT_TO_TEST/example/*" -o $TRAVIS_BUILD_DIR/coverals/coverage.info
# ... erasing data that is not related to this project directly
- OTHER_LIBS=`grep "submodule .*" .gitmodules | sed 's/\[submodule\ "\(.*\)"\]/"\*\/boost\/\1\.hpp" "\*\/boost\/\1\/\*"/g'| sed "/\"\*\/boost\/$PROJECT_TO_TEST\/\*\"/d" | sed ':a;N;$!ba;s/\n/ /g'`
- OTHER_LIBS=`grep "submodule .*" .gitmodules | sed 's/\[submodule\ "\(.*\)"\]/"\*\/boost\/\1\.hpp" "\*\/libs\/\1\/\*" "\*\/boost\/\1\/\*"/g'| sed "/\"\*\/$PROJECT_TO_TEST\/\*\"/d" | sed ':a;N;$!ba;s/\n/ /g'`
- echo $OTHER_LIBS
- eval "$LCOV --remove $TRAVIS_BUILD_DIR/coverals/coverage.info $OTHER_LIBS -o $TRAVIS_BUILD_DIR/coverals/coverage.info"

View File

@@ -98,7 +98,7 @@ public:
};
static std::string mingw_demangling_workaround(const std::string& s) {
inline std::string mingw_demangling_workaround(const std::string& s) {
#ifdef BOOST_GCC
if (s.empty()) {
return s;
@@ -114,6 +114,12 @@ static std::string mingw_demangling_workaround(const std::string& s) {
#endif
}
inline void trim_right_zeroes(std::string& s) {
while (s.back() == '\0') {
s.pop_back();
}
}
class debugging_symbols: boost::noncopyable {
static void try_init_com(com_holder< ::IDebugSymbols>& idebug, const com_global_initer& com) BOOST_NOEXCEPT {
com_holder< ::IDebugClient> iclient(com);
@@ -217,6 +223,7 @@ public:
&size,
0
));
trim_right_zeroes(result);
} else if (res) {
result = name;
}
@@ -301,6 +308,7 @@ public:
&size,
0
));
trim_right_zeroes(result.first);
result.second = line_num;
if (!res) {

View File

@@ -59,6 +59,9 @@ public:
std::string to_string(const frame* frames, std::size_t size) {
std::string res;
if (size == 0) {
return res;
}
res.reserve(64 * size);
to_string_impl impl;
@@ -82,6 +85,10 @@ std::string to_string(const frame* frames, std::size_t size) {
std::string frame::name() const {
if (!addr_) {
return std::string();
}
#if !defined(BOOST_WINDOWS) && !defined(__CYGWIN__)
::Dl_info dli;
const bool dl_ok = !!::dladdr(const_cast<void*>(addr_), &dli); // `dladdr` on Solaris accepts nonconst addresses
@@ -93,6 +100,10 @@ std::string frame::name() const {
}
std::string to_string(const frame& f) {
if (!f) {
return std::string();
}
boost::stacktrace::detail::to_string_impl impl;
return impl(f.address());
}

View File

@@ -195,6 +195,10 @@ inline std::string name_impl(const void* addr) {
std::string frame::source_file() const {
std::string res;
if (!addr_) {
return res;
}
boost::stacktrace::detail::program_location prog_location;
::backtrace_state* state = boost::stacktrace::detail::construct_state(prog_location);
@@ -213,6 +217,10 @@ std::string frame::source_file() const {
}
std::size_t frame::source_line() const {
if (!addr_) {
return 0;
}
boost::stacktrace::detail::program_location prog_location;
::backtrace_state* state = boost::stacktrace::detail::construct_state(prog_location);

View File

@@ -10,6 +10,8 @@
#include <stdexcept>
#include <iostream>
#include <sstream>
#include <cctype>
#include <boost/core/lightweight_test.hpp>
#include <boost/functional/hash.hpp>
@@ -45,6 +47,25 @@ void test_deeply_nested_namespaces() {
BOOST_TEST(ns1 != return_from_nested_namespaces()); // Different addresses in test_deeply_nested_namespaces() function
}
std::size_t count_unprintable_chars(const std::string& s) {
std::size_t result = 0;
for (std::size_t i = 0; i < s.size(); ++i) {
result += (std::isprint(s[i]) ? 0 : 1);
}
return result;
}
void test_frames_string_data_validity() {
stacktrace trace = return_from_nested_namespaces();
for (std::size_t i = 0; i < trace.size(); ++i) {
BOOST_TEST_EQ(count_unprintable_chars(trace[i].source_file()), 0);
BOOST_TEST_EQ(count_unprintable_chars(trace[i].name()), 0);
}
BOOST_TEST(to_string(trace).find('\0') == std::string::npos);
}
// Template parameter Depth is to produce different functions on each Depth. This simplifies debugging when one of the tests catches error
template <std::size_t Depth>
void test_nested(bool print = true) {
@@ -79,8 +100,6 @@ void test_nested(bool print = true) {
BOOST_TEST(ss1.str().find("function_from_main_translation_unit") != std::string::npos);
BOOST_TEST(ss2.str().find("function_from_main_translation_unit") != std::string::npos);
#endif
//BOOST_TEST(false);
}
template <class Bt>
@@ -208,9 +227,9 @@ void test_frame() {
boost::stacktrace::frame empty_frame;
BOOST_TEST(!empty_frame);
BOOST_TEST(empty_frame.source_file() == "");
BOOST_TEST(empty_frame.name() == "");
BOOST_TEST(empty_frame.source_line() == 0);
BOOST_TEST_EQ(empty_frame.source_file(), "");
BOOST_TEST_EQ(empty_frame.name(), "");
BOOST_TEST_EQ(empty_frame.source_line(), 0);
}
// Template parameter bool BySkip is to produce different functions on each BySkip. This simplifies debugging when one of the tests catches error
@@ -240,6 +259,7 @@ void test_empty_basic_stacktrace() {
int main() {
test_deeply_nested_namespaces();
test_frames_string_data_validity();
test_nested<15>();
test_comparisons();
test_iterators();