Merge pull request #1728 from t-b/fix-clang-sanitizer-invocation
Fix clang sanitizer invocation
This commit is contained in:
commit
a6bd798bfa
6 changed files with 23 additions and 13 deletions
11
.travis.yml
11
.travis.yml
|
@ -43,12 +43,15 @@ matrix:
|
||||||
- os: linux
|
- os: linux
|
||||||
compiler: clang
|
compiler: clang
|
||||||
env:
|
env:
|
||||||
- COMPILER=clang++-5.0
|
- COMPILER=clang++-7
|
||||||
- CMAKE_OPTIONS=-DJSON_Sanitizer=ON
|
- CMAKE_OPTIONS=-DJSON_Sanitizer=ON
|
||||||
|
- UBSAN_OPTIONS=print_stacktrace=1,suppressions=$(pwd)/test/src/UBSAN.supp
|
||||||
addons:
|
addons:
|
||||||
apt:
|
apt:
|
||||||
sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-trusty-5.0']
|
sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-trusty-7']
|
||||||
packages: ['g++-6', 'clang-5.0', 'ninja-build']
|
packages: ['g++-6', 'clang-7', 'ninja-build']
|
||||||
|
before_script:
|
||||||
|
- export PATH=$PATH:/usr/lib/llvm-7/bin
|
||||||
|
|
||||||
# cppcheck
|
# cppcheck
|
||||||
- os: linux
|
- os: linux
|
||||||
|
@ -330,7 +333,7 @@ script:
|
||||||
# compile and execute unit tests
|
# compile and execute unit tests
|
||||||
- mkdir -p build && cd build
|
- mkdir -p build && cd build
|
||||||
- cmake .. ${CMAKE_OPTIONS} -DJSON_MultipleHeaders=${MULTIPLE_HEADERS} -GNinja && cmake --build . --config Release
|
- cmake .. ${CMAKE_OPTIONS} -DJSON_MultipleHeaders=${MULTIPLE_HEADERS} -GNinja && cmake --build . --config Release
|
||||||
- ctest -C Release -V -j
|
- ctest -C Release --timeout 2700 -V -j
|
||||||
- cd ..
|
- cd ..
|
||||||
|
|
||||||
# check if homebrew works (only checks develop branch)
|
# check if homebrew works (only checks develop branch)
|
||||||
|
|
|
@ -154,7 +154,10 @@ struct external_constructor<value_t::array>
|
||||||
j.m_type = value_t::array;
|
j.m_type = value_t::array;
|
||||||
j.m_value = value_t::array;
|
j.m_value = value_t::array;
|
||||||
j.m_value.array->resize(arr.size());
|
j.m_value.array->resize(arr.size());
|
||||||
std::copy(std::begin(arr), std::end(arr), j.m_value.array->begin());
|
if (arr.size() > 0)
|
||||||
|
{
|
||||||
|
std::copy(std::begin(arr), std::end(arr), j.m_value.array->begin());
|
||||||
|
}
|
||||||
j.assert_invariant();
|
j.assert_invariant();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -131,9 +131,8 @@ class input_stream_adapter : public input_adapter_protocol
|
||||||
class input_buffer_adapter : public input_adapter_protocol
|
class input_buffer_adapter : public input_adapter_protocol
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
JSON_HEDLEY_NON_NULL(2)
|
|
||||||
input_buffer_adapter(const char* b, const std::size_t l) noexcept
|
input_buffer_adapter(const char* b, const std::size_t l) noexcept
|
||||||
: cursor(b), limit(b + l)
|
: cursor(b), limit(b == nullptr ? nullptr : (b + l))
|
||||||
{}
|
{}
|
||||||
|
|
||||||
// delete because of pointer members
|
// delete because of pointer members
|
||||||
|
@ -147,6 +146,7 @@ class input_buffer_adapter : public input_adapter_protocol
|
||||||
{
|
{
|
||||||
if (JSON_HEDLEY_LIKELY(cursor < limit))
|
if (JSON_HEDLEY_LIKELY(cursor < limit))
|
||||||
{
|
{
|
||||||
|
assert(cursor != nullptr and limit != nullptr);
|
||||||
return std::char_traits<char>::to_int_type(*(cursor++));
|
return std::char_traits<char>::to_int_type(*(cursor++));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3489,7 +3489,10 @@ struct external_constructor<value_t::array>
|
||||||
j.m_type = value_t::array;
|
j.m_type = value_t::array;
|
||||||
j.m_value = value_t::array;
|
j.m_value = value_t::array;
|
||||||
j.m_value.array->resize(arr.size());
|
j.m_value.array->resize(arr.size());
|
||||||
std::copy(std::begin(arr), std::end(arr), j.m_value.array->begin());
|
if (arr.size() > 0)
|
||||||
|
{
|
||||||
|
std::copy(std::begin(arr), std::end(arr), j.m_value.array->begin());
|
||||||
|
}
|
||||||
j.assert_invariant();
|
j.assert_invariant();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -3882,9 +3885,8 @@ class input_stream_adapter : public input_adapter_protocol
|
||||||
class input_buffer_adapter : public input_adapter_protocol
|
class input_buffer_adapter : public input_adapter_protocol
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
JSON_HEDLEY_NON_NULL(2)
|
|
||||||
input_buffer_adapter(const char* b, const std::size_t l) noexcept
|
input_buffer_adapter(const char* b, const std::size_t l) noexcept
|
||||||
: cursor(b), limit(b + l)
|
: cursor(b), limit(b == nullptr ? nullptr : (b + l))
|
||||||
{}
|
{}
|
||||||
|
|
||||||
// delete because of pointer members
|
// delete because of pointer members
|
||||||
|
@ -3898,6 +3900,7 @@ class input_buffer_adapter : public input_adapter_protocol
|
||||||
{
|
{
|
||||||
if (JSON_HEDLEY_LIKELY(cursor < limit))
|
if (JSON_HEDLEY_LIKELY(cursor < limit))
|
||||||
{
|
{
|
||||||
|
assert(cursor != nullptr and limit != nullptr);
|
||||||
return std::char_traits<char>::to_int_type(*(cursor++));
|
return std::char_traits<char>::to_int_type(*(cursor++));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ option(JSON_Coverage "Build test suite with coverage information" OFF)
|
||||||
if(JSON_Sanitizer)
|
if(JSON_Sanitizer)
|
||||||
message(STATUS "Building test suite with Clang sanitizer")
|
message(STATUS "Building test suite with Clang sanitizer")
|
||||||
if(NOT MSVC)
|
if(NOT MSVC)
|
||||||
set(CMAKE_CXX_FLAGS "-g -O2 -fsanitize=address -fsanitize=undefined -fsanitize=integer -fsanitize=nullability -fno-omit-frame-pointer")
|
set(CMAKE_CXX_FLAGS "-g -O0 -fsanitize=address -fsanitize=undefined -fsanitize=integer -fsanitize=nullability -fno-omit-frame-pointer -fno-sanitize-recover=all -fsanitize-recover=unsigned-integer-overflow")
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
1
test/src/UBSAN.supp
Normal file
1
test/src/UBSAN.supp
Normal file
|
@ -0,0 +1 @@
|
||||||
|
unsigned-integer-overflow:stl_bvector.h
|
Loading…
Reference in a new issue